Mongoosej.Blog.Software.Application Software.PM.Maven
official website
official Github
official manual
runoob
introduction
POM
pom.dependencyManagement.dependencies
springboot依赖管理
springboot的依赖管理,包含了springboot常用依赖jar包的版本管理,以及常用插件的版本管理(不包含插件的详细配置)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
pom.build.pluginManagement.plugins
Maven Available Plugins
插件的版本通常不直接指定,而是通过pom.build.pluginManagement进行插件管理,像pom.dependencyManagement一样进行项目的版本集中管理。二者在版本指定上类似,如果插件或者依赖管理中已经指定了版本号,则在引用GAV处不再需要指定version。
编译插件
该插件可以指定工程的JRE版本、编码等基础设置。
- IDE也可以指定工程的JRE版本,但是如果maven也指定了,那么maven update时会自动将JRE更改为pom中配置的版本。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
打包插件
该插件可以将工程打包为jar、war等,同时可以生成MANIFEST文件中的条目。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 自动将所有依赖jar包添加到Class-Path属性 -->
<addClasspath>true</addClasspath>
<!-- 可以通过此处的值来为每一个添加到Class-Path属性的依赖jar包添加路径前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 指定打包jar的主启动类 -->
<mainClass>com.mongoosej.wcs.collector.CollectorApplication</mainClass>
</manifest>
<!-- 可以自定义manifest条目,条目完全自定义,不一定是jsr规范的内容 -->
<manifestEntries>
<!-- 通过Class-Path条目指定jar依赖的类路径,如果使用了addClasspath,那么此处的设置将被覆盖 -->
<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>
<Plugin-Class>com.kimojar.tool.wcs.logmining.plugin.LogMiningPlugin</Plugin-Class>
</manifestEntries>
</archive>
<!-- 定义打包的jar的输出文件夹,如果不指定,默认输出到target目录下,如下的配置也是输出到target目录下 -->
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
依赖拷贝插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 定义pom依赖的jar的输出文件夹,如果不指定,默认输出到target/dependency/目录下,如下的配置也是输出到target/dependency/目录下 -->
<outputDirectory>${project.build.directory}/dependency/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
使用该插件后,每次maven-install都会将pom依赖的jar输出到指定文件夹,一定程度会增加打包耗时,而且大多数时候都不需要每次maven-install都需要拷贝pom依赖的jar。所以可以使用该插件,转而用IDE的指令来执行maven的copy-dependencies指令。
资源拷贝插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<!-- 被拷贝的资源的源目录 -->
<directory>src/main/resources</directory>
</resource>
</resources>
<!-- 资源输出目录 -->
<outputDirectory>${project.build.directory}/resources</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
和maven-dependency-plugin插件一样,可以使用IDE的指令来执行maven的copy-resources指令,而不必每次maven-install都拷贝资源文件。
时间戳自定义插件
该插件可以自定义时区,可以解决${maven.build.timestamp}引用的时区为UTC且不可更改,进而导致时间戳相差8小时的问题。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>timestamp-property</id>
<goals>
<goal>timestamp-property</goal>
</goals>
</execution>
</executions>
<configuration>
<name>current.time</name>
<pattern>yyyyMMddHHmm</pattern>
<timeZone>GMT+8</timeZone>
</configuration>
</plugin>
springboot打包插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<outputDirectory>${project.build.directory}/springboot/</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<!-- 如果配置了maven-jar-plugin,此处配置可以再次打包springboot应用 -->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</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的版本管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.1</version>
<type>pom</type>
<!-- scope要为import -->
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>