pluginManagement:管理Maven插件

Maven 使用 dependencyManagement 对依赖进行管理,与之类似地,Maven 中还提供了一个名为 pluginManagement 的元素,它可以帮助用户管理 Maven 插件。

插件管理

pluginManagement 元素与 dependencyManagement 元素的原理十分相似,在 pluginManagement 元素中可以声明插件及插件配置,但不会发生实际的插件调用行为,只有在 POM 中配置了真正的 plugin 元素,且其 groupId 和 artifactId 与 pluginManagement 元素中配置的插件匹配时,pluginManagement 元素的配置才会影响到实际的插件行为。

例如,在 App-Data-lib 模块中使用 pluginManagement 元素管理 maven-source-plugin 插件,并将其插件目标 jar-no-fork 绑定到 default 生命周期的 verify 阶段上,具体配置如下。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <artifactId>App-Data-lib</artifactId>
  6. <parent>
  7. <groupId>net.jhelp.www</groupId>
  8. <artifactId>Root</artifactId>
  9. <version>1.0</version>
  10. </parent>
  11. <dependencies>
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. </dependency>
  16. </dependencies>
  17. <!--添加插件管理-->
  18. <build>
  19. <pluginManagement>
  20. <plugins>
  21. <!--声明插件-->
  22. <plugin>
  23. <groupId>org.apache.maven.plugins</groupId>
  24. <artifactId>maven-source-plugin</artifactId>
  25. <version>3.2.1</version>
  26. <executions>
  27. <!--将 jar-no-fork 目标绑定到 verify 阶段-->
  28. <execution>
  29. <id>www.jhelp.net</id>
  30. <phase>verify</phase>
  31. <goals>
  32. <goal>
  33. jar-no-fork
  34. </goal>
  35. </goals>
  36. </execution>
  37. </executions>
  38. </plugin>
  39. </plugins>
  40. </pluginManagement>
  41. </build>
  42. </project>

根据以上配置可以看出,使用 pluginManagement 管理插件很简单,只需要将声明插件的配置添加在 pluginManagement 元素中即可。

由于该插件目标是绑定在 verify 阶段上,因此我们只需要执行 verify 或以后的阶段(如 install )即可调用 maven-source-plugin:jar-no-fork 目标。

打开命令行窗口,跳转到 App-Data-lib 的目录下,执行以下命令,尝试调用 maven-source-plugin:jar-no-fork 目标。

  • mvn clean install

执行结果如下。

  • [INFO] Scanning for projects...
  • [INFO]
  • [INFO] -------------------< net.jhelp.www:App-Data-lib >-------------------
  • [INFO] Building App-Data-lib 1.0
  • [INFO] --------------------------------[ jar ]---------------------------------
  • [INFO]
  • [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ App-Data-lib ---
  • [INFO] Deleting D:\eclipse workSpace4\App-Data-lib\target
  • [INFO]
  • [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ App-Data-lib ---
  • [INFO] Using 'UTF-8' encoding to copy filtered resources.
  • [INFO] skip non existing resourceDirectory D:\eclipse workSpace4\App-Data-lib\src\main\resources
  • [INFO]
  • [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ App-Data-lib ---
  • [INFO] Changes detected - recompiling the module!
  • [INFO] Compiling 1 source file to D:\eclipse workSpace4\App-Data-lib\target\classes
  • [INFO]
  • [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ App-Data-lib ---
  • [INFO] Using 'UTF-8' encoding to copy filtered resources.
  • [INFO] skip non existing resourceDirectory D:\eclipse workSpace4\App-Data-lib\src\test\resources
  • [INFO]
  • [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ App-Data-lib ---
  • [INFO] Changes detected - recompiling the module!
  • [INFO] Compiling 1 source file to D:\eclipse workSpace4\App-Data-lib\target\test-classes
  • [INFO]
  • [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ App-Data-lib ---
  • [INFO] Surefire report directory: D:\eclipse workSpace4\App-Data-lib\target\surefire-reports
  • -------------------------------------------------------
  • T E S T S
  • -------------------------------------------------------
  • Running net.jhelp.www.App_Data_lib.AppTest
  • Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 sec
  • Results :
  • Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
  • [INFO]
  • [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ App-Data-lib ---
  • [INFO] Building jar: D:\eclipse workSpace4\App-Data-lib\target\App-Data-lib-1.0.jar
  • [INFO]
  • [INFO] --- maven-install-plugin:2.4:install (default-install) @ App-Data-lib ---
  • [INFO] Installing D:\eclipse workSpace4\App-Data-lib\target\App-Data-lib-1.0.jar to D:\myRepository\repository\net\bianc
  • heng\www\App-Data-lib\1.0\App-Data-lib-1.0.jar
  • [INFO] Installing D:\eclipse workSpace4\App-Data-lib\pom.xml to D:\myRepository\repository\net\jhelp\www\App-Data-li
  • b\1.0\App-Data-lib-1.0.pom
  • [INFO] ------------------------------------------------------------------------
  • [INFO] BUILD SUCCESS
  • [INFO] ------------------------------------------------------------------------
  • [INFO] Total time: 2.469 s
  • [INFO] Finished at: 2021-04-16T09:23:26+08:00
  • [INFO] ------------------------------------------------------------------------

通过以上执行结果,我们看到 maven-source-plugin:jar-no-fork 目标并没有被调用。

在 App-Data-lib 的 POM 文件中添加 plugin 元素声明需要调用的插件。

  1. <project>
  2. ...
  3. <!--添加插件管理-->
  4. <build>
  5. <pluginManagement>
  6. ...
  7. </pluginManagement>
  8. <!-- 声明使用 maven-source-plugin 插件 -->
  9. <plugins>
  10. <plugin>
  11. <groupId>org.apache.maven.plugins</groupId>
  12. <artifactId>maven-source-plugin</artifactId>
  13. </plugin>
  14. </plugins>
  15. </build>
  16. </project>

与依赖管理相似,由于 pluginManagement 元素中已经包含了插件的全部信息,所以当使用 plugins 元素声明插件调用时,只需要声明插件的 groupId 和 artifactId 即可。

再次执行命令 mvn clean install,maven-source-plugin:jar-no-fork 目标被成功调用,如图 1 所示。

Maven 插件管理

图1:Maven 插件管理执行结果

继承插件依赖

当项目中的多个模块存在相同的插件时,应当将插件配置移动到父模块的 pluginManagement 元素中。即使各个模块对于同一插件的具体配置不尽相同,也应当在父模块中使用 pluginManagement 元素对插件版本进行统一声明。

我们甚至可以将项目中所有插件的版本信息都在父模块的 POM 中声明,子模块中不再配置任何的版本信息,这样不仅可以统一项目的插件版本,还可以避免出现版本冲突或插件不稳定等问题。

例如,我们将 App-Data-lib 中 pluginManagement 元素中的配置内容移动到父模块 Root 的 POM 中,具体配置入下。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>net.jhelp.www</groupId>
  6. <artifactId>Root</artifactId>
  7. <version>1.0</version>
  8. <!--定义的父类pom.xml 打包类型使pom -->
  9. <packaging>pom</packaging>
  10. <properties>
  11. <!-- 定义一些属性 -->
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <log4j.version>1.2.17</log4j.version>
  14. <junit.version>4.9</junit.version>
  15. <system.version>1.0</system.version>
  16. <mysql.connector.version>5.1.18</mysql.connector.version>
  17. <c3p0.version>0.9.1</c3p0.version>
  18. </properties>
  19. <!--dependencyManagement 标签用于控制子模块的依赖版本等信息 -->
  20. <!-- 该标签只用来控制版本,不能将依赖引入 -->
  21. <dependencyManagement>
  22. <dependencies>
  23. <dependency>
  24. <groupId>log4j</groupId>
  25. <artifactId>log4j</artifactId>
  26. <!--引用的properties标签中定义的属性 -->
  27. <version>${log4j.version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>junit</groupId>
  31. <artifactId>junit</artifactId>
  32. <!--引用的properties标签中定义的属性 -->
  33. <version>${junit.version}</version>
  34. <!-- <scope>test</scope> -->
  35. </dependency>
  36. <dependency>
  37. <groupId>mysql</groupId>
  38. <artifactId>mysql-connector-java</artifactId>
  39. <!--引用的properties标签中定义的属性 -->
  40. <version>${mysql.connector.version}</version>
  41. <scope>runtime</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>c3p0</groupId>
  45. <artifactId>c3p0</artifactId>
  46. <!--引用的properties标签中定义的属性 -->
  47. <version>${c3p0.version}</version>
  48. </dependency>
  49. </dependencies>
  50. </dependencyManagement>
  51. <!--插件依赖-->
  52. <build>
  53. <pluginManagement>
  54. <plugins>
  55. <plugin>
  56. <groupId>org.apache.maven.plugins</groupId>
  57. <artifactId>maven-source-plugin</artifactId>
  58. <version>3.2.1</version>
  59. <executions>
  60. <execution>
  61. <id>www.jhelp.net parent</id>
  62. <phase>verify</phase>
  63. <goals>
  64. <goal>
  65. jar-no-fork
  66. </goal>
  67. </goals>
  68. </execution>
  69. </executions>
  70. </plugin>
  71. </plugins>
  72. </pluginManagement>
  73. </build>
  74. </project>

在 App-Data-lib 的 POM 中使用 parent 元素继承 Root ,并声明使用 maven-source-plugin 插件,配置如下。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <artifactId>App-Data-lib</artifactId>
  6. <parent>
  7. <groupId>net.jhelp.www</groupId>
  8. <artifactId>Root</artifactId>
  9. <version>1.0</version>
  10. </parent>
  11. <dependencies>
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. </dependency>
  16. </dependencies>
  17. <build>
  18. <plugins>
  19. <!-- 声明使用 maven-source-plugin 插件 -->
  20. <plugin>
  21. <groupId>org.apache.maven.plugins</groupId>
  22. <artifactId>maven-source-plugin</artifactId>
  23. </plugin>
  24. </plugins>
  25. </build>
  26. </project>

打开命令行窗口,跳转到 App-Data-lib 的目录下,执行命令

  • mvn clean install

执行结果如下图。

Maven 继承插件管理

图2:Maven  继承插件管理

腾讯云推出云产品限时特惠抢购活动:2C2G云服务器7.9元/月起
本文链接:https://www.jhelp.net/p/aZ5rvQzxf06ZNsnF (转载请保留)。
关注下面的标签,发现更多相似文章