Maven完全指南 - 10. 构建配置

519 阅读4分钟

10. 构建配置

在 Maven 中,<build> 配置块用于定义项目的构建流程,包括指定插件、构建目录、资源目录、测试资源、编译选项等。该配置块帮助控制项目从编译到打包发布的各个阶段。

构建配置.png

配置示例:

<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>