10. 构建配置
在 Maven 中,<build>
配置块用于定义项目的构建流程,包括指定插件、构建目录、资源目录、测试资源、编译选项等。该配置块帮助控制项目从编译到打包发布的各个阶段。
配置示例:
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<directory>target</directory>
<finalName>myapp-1.0.0</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>config/**</include>
<include>messages/*.properties</include>
</includes>
<excludes>
<exclude>**/*.tmp</exclude>
<exclude>logs/**</exclude>
</excludes>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>false</filtering>
</testResource>
</testResources>
<filters>
<filter>filters/dev.properties</filter>
</filters>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<executions>
<execution>
<id>compile-phase</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile-phase</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<finalName>my-app</finalName>
</configuration>
</plugin>
</plugins>
</build>
10.1 基础配置
<sourceDirectory>
:指定源码目录,默认值为 src/main/java。<outputDirectory>
:指定编译输出目录,默认值为 target/classes。<testSourceDirectory>
:指定测试源码目录,默认值为 src/test/java。<testOutputDirectory>
:指定测试编译输出目录,默认值为 target/test-classes。<directory>
:指定构建生成文件的目标目录,默认值为 target。<finalName>
:定义打包构件的最终名称,不包括扩展名。通常用于设置 JAR、WAR 等构件文件的名称,默认值为项目的构件和版本的组合$artifactId-$version
,比如上面配置中最后生成的构件为 target/myapp-1.0.0.jar。<defaultGoal>
:用于指定 Maven 执行时的默认目标(goal)。它的作用是为运行 Maven 命令时提供一个默认的构建目标,用户在执行 mvn 命令时,如果没有显式指定目标,Maven 将自动使用该默认目标。
10.2 资源配置
<resources>
:正式资源目录配置,包含 src/main/resources 等,Maven 将在构建时将资源文件 复制 到输出目录。<resource>
标签内可以指定<directory>
路径,并用<includes>
和<excludes>
控制要包含或排除的文件。<testResources>
:测试资源目录配置,类似于<resources>
,用于指定测试文件夹中的资源目录(通常是 src/test/resources),用于测试阶段。
正式资源和测试资源都可以通过<filtering>
来配置是否以启用资源过滤。启用资源过滤后,Maven 会在资源文件中替换符合 ${property}
格式的属性引用占位符。
10.3 资源过滤
在 Maven 中,资源过滤允许在构建过程中对资源文件中的占位符进行替换,以便根据不同环境动态生成配置文件,这对项目中包含敏感信息(如数据库连接信息)或需要多环境支持的场景特别有用。
在 pom.xml 文件可以通过 <filters>
中的 <filter>
来定义 过滤文件,过滤文件采用属性文件格式定义了许多属性,以对资源文件中的占位符进行替换。
资源过滤时,Maven 的属性优先级从高到低依次为:
- 命令行属性(使用 -Dproperty=value 设置)
- POM 文件中的
<properties>
节点 <profile>
配置的过滤文件<build>
配置的过滤文件
我们可以通过过滤文件定义不同环境下的不同配置:
project-root
├── src
│ └── main
│ └── resources
│ └── config.properties # 配置文件
└── filters
└── dev.properties # 开发环境的过滤配置
└── prod.properties # 生产环境的过滤配置
10.4 插件配置
在 Maven 中,插件配置是构建和项目管理的核心功能之一。Maven 通过插件来实现项目构建的不同阶段和任务,包括编译、测试、打包、发布等。插件在 Maven 的 <plugins>
标签内进行配置。Maven 默认包含许多常用插件,如 maven-compiler-plugin、maven-surefire-plugin 等,但也支持自定义插件以扩展功能。
- 插件坐标:
<groupId>、
和
` 这三个元素指定插件的 Maven 坐标,帮助 Maven 定位插件的版本和来源。 - 插件执行:
<executions>
定义插件的多个执行。<execution>
:表示插件执行的单元,可以定义多个执行。<id>
:执行 ID,可以用来标识此执行。<goals>
:定义插件要执行的目标,例如编译插件的 compile、testCompile 目标。<phase>
:将插件的执行绑定到生命周期的一个阶段,Maven 会在这个阶段自动执行此插件。<configuration>
:针对特定执行的配置。
- 插件配置:
<configuration>
全局配置项,在<executions>
外部,适用于插件的所有执行。
10.5 插件管理
<pluginManagement>
是 Maven POM 文件中的一个重要元素,主要用于集中管理项目的插件 版本 和 配置。虽然它并不直接执行插件,但可以为所有子模块提供插件的配置、版本和管理策略。它主要用于父 POM,以便在多个子模块中共享相同的插件版本和配置,确保构建过程的一致性。
主要特点:
- 不会执行:
<pluginManagement>
中定义的插件不会在构建时自动执行,只有在子模块或其他 POM 中显式声明该插件时,才会应用其版本和配置。 - 版本控制:建议使用
<pluginManagement>
来指定插件的版本,以避免不同模块使用不同版本的插件而导致构建不一致的问题。
使用示例:
<project>
...
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
...
</project>