Mongoosej.Blog.Software.Application Software.PM.Maven


official website
official Github
official manual
runoob
introduction

POM

pom.dependencyManagement.dependencies

springboot依赖管理

springboot的依赖管理,包含了springboot常用依赖jar包的版本管理,以及常用插件的版本管理(不包含插件的详细配置)。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-dependencies</artifactId>
  4. <version>2.6.1</version>
  5. <type>pom</type>
  6. <scope>import</scope>
  7. </dependency>

pom.build.pluginManagement.plugins

Maven Available Plugins
插件的版本通常不直接指定,而是通过pom.build.pluginManagement进行插件管理,像pom.dependencyManagement一样进行项目的版本集中管理。二者在版本指定上类似,如果插件或者依赖管理中已经指定了版本号,则在引用GAV处不再需要指定version。

编译插件

该插件可以指定工程的JRE版本、编码等基础设置。

  • IDE也可以指定工程的JRE版本,但是如果maven也指定了,那么maven update时会自动将JRE更改为pom中配置的版本。
    1. <plugin>
    2. <groupId>org.apache.maven.plugins</groupId>
    3. <artifactId>maven-compiler-plugin</artifactId>
    4. <configuration>
    5. <source>${java.version}</source>
    6. <target>${java.version}</target>
    7. <encoding>UTF-8</encoding>
    8. </configuration>
    9. </plugin>

打包插件

该插件可以将工程打包为jar、war等,同时可以生成MANIFEST文件中的条目。

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-jar-plugin</artifactId>
  4. <configuration>
  5. <archive>
  6. <manifest>
  7. <!-- 自动将所有依赖jar包添加到Class-Path属性 -->
  8. <addClasspath>true</addClasspath>
  9. <!-- 可以通过此处的值来为每一个添加到Class-Path属性的依赖jar包添加路径前缀 -->
  10. <classpathPrefix>lib/</classpathPrefix>
  11. <!-- 指定打包jar的主启动类 -->
  12. <mainClass>com.mongoosej.wcs.collector.CollectorApplication</mainClass>
  13. </manifest>
  14. <!-- 可以自定义manifest条目,条目完全自定义,不一定是jsr规范的内容 -->
  15. <manifestEntries>
  16. <!-- 通过Class-Path条目指定jar依赖的类路径,如果使用了addClasspath,那么此处的设置将被覆盖 -->
  17. <Class-Path>. lib/com.kimojar.util.classloader-1.0.1.jar lib/spring-boot-2.6.1.jar lib/spring-boot-autoconfigure-2.6.1.jar lib/spring-context-5.3.13.jar lib/spring-core-5.3.13.jar lib/spring-aop-5.3.13.jar lib/spring-beans-5.3.13.jar</Class-Path>
  18. <Plugin-Class>com.kimojar.tool.wcs.logmining.plugin.LogMiningPlugin</Plugin-Class>
  19. </manifestEntries>
  20. </archive>
  21. <!-- 定义打包的jar的输出文件夹,如果不指定,默认输出到target目录下,如下的配置也是输出到target目录下 -->
  22. <outputDirectory>${project.build.directory}</outputDirectory>
  23. </configuration>
  24. </plugin>

依赖拷贝插件

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-dependency-plugin</artifactId>
  4. <executions>
  5. <execution>
  6. <id>copy-dependencies</id>
  7. <phase>package</phase>
  8. <goals>
  9. <goal>copy-dependencies</goal>
  10. </goals>
  11. <configuration>
  12. <!-- 定义pom依赖的jar的输出文件夹,如果不指定,默认输出到target/dependency/目录下,如下的配置也是输出到target/dependency/目录下 -->
  13. <outputDirectory>${project.build.directory}/dependency/</outputDirectory>
  14. </configuration>
  15. </execution>
  16. </executions>
  17. </plugin>

使用该插件后,每次maven-install都会将pom依赖的jar输出到指定文件夹,一定程度会增加打包耗时,而且大多数时候都不需要每次maven-install都需要拷贝pom依赖的jar。所以可以使用该插件,转而用IDE的指令来执行maven的copy-dependencies指令。
mvn-copy dependencies.png

资源拷贝插件

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-resources-plugin</artifactId>
  4. <executions>
  5. <execution>
  6. <id>copy-resources</id>
  7. <phase>package</phase>
  8. <goals>
  9. <goal>copy-resources</goal>
  10. </goals>
  11. <configuration>
  12. <resources>
  13. <resource>
  14. <!-- 被拷贝的资源的源目录 -->
  15. <directory>src/main/resources</directory>
  16. </resource>
  17. </resources>
  18. <!-- 资源输出目录 -->
  19. <outputDirectory>${project.build.directory}/resources</outputDirectory>
  20. </configuration>
  21. </execution>
  22. </executions>
  23. </plugin>

和maven-dependency-plugin插件一样,可以使用IDE的指令来执行maven的copy-resources指令,而不必每次maven-install都拷贝资源文件。

时间戳自定义插件

该插件可以自定义时区,可以解决${maven.build.timestamp}引用的时区为UTC且不可更改,进而导致时间戳相差8小时的问题。

  1. <plugin>
  2. <groupId>org.codehaus.mojo</groupId>
  3. <artifactId>build-helper-maven-plugin</artifactId>
  4. <executions>
  5. <execution>
  6. <id>timestamp-property</id>
  7. <goals>
  8. <goal>timestamp-property</goal>
  9. </goals>
  10. </execution>
  11. </executions>
  12. <configuration>
  13. <name>current.time</name>
  14. <pattern>yyyyMMddHHmm</pattern>
  15. <timeZone>GMT+8</timeZone>
  16. </configuration>
  17. </plugin>

springboot打包插件

  1. <plugin>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-maven-plugin</artifactId>
  4. <configuration>
  5. <executable>true</executable>
  6. <outputDirectory>${project.build.directory}/springboot/</outputDirectory>
  7. </configuration>
  8. <executions>
  9. <execution>
  10. <goals>
  11. <!-- 如果配置了maven-jar-plugin,此处配置可以再次打包springboot应用 -->
  12. <goal>repackage</goal>
  13. </goals>
  14. </execution>
  15. </executions>
  16. </plugin>

FAQ

maven install

can not resolve dependency, maven install failed

settings.xml文件中可能设置了两个repository,比如一个私服仓和一个中央仓,很多依赖的jar来自于私服仓,构建的时候,可能会由于到中央仓加载依赖失败,导致install failed。这时候,只需要将中央仓去掉,只使用私服仓,再重新install,通常能够解决该问题。

工程的包图标变成了文件夹图标

这通常是由于maven的编译插件:org.apache.maven.plugins:maven-compiler-plugin未正常加载导致。maven-update检查编译插件是否加载。

使用springboot的版本管理

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-dependencies</artifactId>
  6. <version>2.6.1</version>
  7. <type>pom</type>
  8. <!-- scope要为import -->
  9. <scope>import</scope>
  10. </dependency>
  11. </dependencies>
  12. </dependencyManagement>