七的博客

快速上手Maven(四)-常用的插件

Maven

快速上手Maven(三)-常用的插件

Maven 的核心是一个框架 , 真正的构建任务都是由各种各样的插件完成的。

Maven 插件是一组一组的目标 ( goal ) , 每个目标对应了构建过程中的一个任务。例如 , 编译 Java 源代码是一个任务 , 对应的就是 maven-compiler-plugin 插件的目标。

1. 内置插件

Maven 有很多内置的插件 , 这些插件对应了构建过程中的各种标准任务。上一章节中的一些常用命令,就是通过下面这些内置的插件来实现的:

  • maven-clean-plugin : 清理项目之前编译生成的文件 , 对应了 clean 生命周期的 clean 阶段。
  • maven-compiler-plugin : 编译 Java 源代码 , 对应了 default 生命周期的 compile 阶段。
  • maven-surefire-plugin : 运行 JUnit 测试等测试用例 , 对应了 default 生命周期的 test 阶段。
  • maven-jar-plugin : 打包 Java 项目为 JAR 文件 , 对应了 default 生命周期的 package 阶段。
  • maven-war-plugin : 打包 Web 项目为 WAR 文件 , 对应了 default 生命周期的 package 阶段。
  • maven-deploy-plugin : 将项目构建的文件部署到远程仓库 , 对应了 default 生命周期的 deploy 阶段。

这些内置插件在 Maven 项目中的使用非常频繁,几乎每个使用 Maven 的 Java 项目都会依赖这些插件来完成基本的构建任务。

2. 其他常用插件

2.1 maven-compiler-plugin

maven-compiler-plugin 用于编译 Java 源代码 , 我们可以配置它来指定 Java 的编译版本。比如要使用 Java 8 来编译项目 , 就可以添加如下配置:

<build>
    <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>
    </plugins>
</build>
  • <source> 元素指定了 Java 源代码的版本

  • <target> 元素指定了生成的 Java 字节码的版本。

  • 设置为 1.8 表示使用 Java 8,你也可以根据项目需求改成相对应的版本。

2.2 maven-resources-plugin

maven-resources-plugin 主要是用于处理项目的资源文件 , 如 .properties 文件、.xml 文件等。

在 pom.xml 中不用显式配置,但是在 process-resourcesprocess-test-resources 阶段使用这个插件的默认配置。当你在 <build> 下的 <resources> 标签中做出配置时,实际上是在定制 maven-resources-plugin 的行为。

2.2.1 自动替换占位符

有时候我们可能需要对资源文件进行一些处理,如过滤占位符。假设我们有一个 app.properties 文件:

app.name=${project.name}
app.version=${project.version}

其中 ${project.name}${project.version} 是占位符 , 我们希望在构建时将其替换为项目不同部署环境的实际名称和版本。可以通过如下配置来实现:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

<filtering>true</filtering> 告诉 Maven 对资源文件启用过滤。Maven 会将占位符替换为 pom.xml 中对应的值。

2.2.2 资源的复制

默认情况下 , Maven 会将 src/main/resources 目录下的所有文件复制到 target/classes 目录,

作为输出的 JAR 文件的一部分。这时候,我们可以使用这个插件,来自定义一些逻辑处理。

比如我们在使用 MyBatis 的时候,为了让 mapper.xml 跟 mapper 接口放一起,这样查找的时候更加方便。我们会将 mapper.xml 放置在 java 目录下,默认情况下,Maven 只会处理 src/main/java 目录下的 .java 文件,忽略其他非 Java 文件。然后等你启动运行的时候,就会提示下面这个异常:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

这时可以通过修改 maven-resources-plugin 的配置来实现 MyBatis xml 文件的处理:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <!-- 特别指定包括 src/main/java 下的 mybatis xml 文件 -->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

2.3 maven-surefire-plugin

maven-surefire-plugin 主要是用于 Maven 的 test 阶段运行单元测试。默认情况下,它会自动执行 src/test/java 目录下所有以 Test 开头或结尾的类的测试方法。

有些项目比如通过 CI/CD 工具,编译后需要确保只有通过所有测试的代码才能继续到部署阶段,否则本次编译将会不通过,这样可以降低线上代码出 Bug 的概率。

2.3.1 跳过测试

有时候我们可能需要跳过一部分测试用例 , 通过如下命令可以跳过测试:

mvn install -DskipTests

还有另外一种方式就是在 pom.xml 中配置 maven-surefire-plugin 插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M1</version>
    <configuration>
        <skipTests>true</skipTests>
    </configuration>
</plugin>

2.3.3 指定测试用例

可以在执行命令的时候指定要运行的测试类或测试方法:

mvn test -Dtest=MyClassTest
mvn test -Dtest=MyClassTest#testMyMethod

或者在 pom.xml 中配置需要执行哪些测试用例:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M1</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

2.4 maven-jar-plugin

maven-jar-plugin 用于将项目打包为 JAR 文件。默认情况下 , 它会将 target/classes 目录下的所有文件打包到 JAR 中。

我们可以通过配置来定制化 JAR 的内容。例如第一章节 HelloWorld 中的例子:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <!-- 这个标签指定了 JAR 文件的入口,即包含 main 方法的主类。-->
                <mainClass>com.suny.mavenexample.App</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

这个配置会在 JAR 的 META-INF/MANIFEST.MF 文件中添加一些属性Main-Class , 这样 JAR 启动的时候可以找到入口并执行,这对于可执行 JAR 文件是很重要的。

2.5 spring-boot-maven-plugin

使用 Spring Boot 开发的话对这个插件肯定不会陌生,这是一个由 Spring Boot 团队提供的一个 Maven 插件 , 它的主要作用是简化 Spring Boot 应用的打包和运行过程。

假设你正在开发一个 Spring Boot Web 应用 , 当你完成开发后 , 你需要将应用打包成一个可执行的 JAR 文件 , 以便部署到服务器上。这就是 spring-boot-maven-plugin 的用武之地, 打包后的文件也叫 fat jar 。 因为所有依赖都被包含在一个单一文件中,所以 JAR 可以直接执行启动。

配置例子:

 
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.1.15.RELEASE</version>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

3. 参考链接