快速上手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-resources
和 process-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. 参考链接
Available Plugins https://maven.apache.org/plugins/
Apache Maven Compiler Plugin https://maven.apache.org/plugins/maven-compiler-plugin/
Apache Maven Resources Plugin https://maven.apache.org/plugins/maven-resources-plugin/
Maven Surefire Plugin https://maven.apache.org/surefire/maven-surefire-plugin/