常用的 pom.xml
文件配置记录
有时为了方便使用会将包括依赖的第三方jar在内的整个项目打包为一个jar包
使用 one-jar,支持Maven插件
直接将工程打出的jar包和依赖jar包一起打进一个新的jar包中,不会解压第三方jar中的class,使用较为方便
<!-- 使用 onejar-maven-plugin 插件生成 all-in-one jar包-->
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<!--程序入口,配合maven-jar-plugin插件使用时不需要,单独使用时自己的jar包不会添加classpath-->
<!--<mainClass>com.example.MainApp</mainClass>-->
<attachToBuild>true</attachToBuild>
<classifier>onejar</classifier>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
maven-shade-plugin
是官方提供的一个打包插件,可定制性高,功能丰富,但是相应的学习成本较 one-jar
要高一些
打包时会将依赖jar包解压,只提取class文件
默认会全部打包,通过该配置可以手动指定排除或包含哪些依赖jar包
artifactSet
包含/排除jar包filters
包含/排除jar包内的资源<executions>
<execution>
<configuration>
<!-- 包含或排除依赖jar包,支持通配符 -->
<artifactSet>
<excludes>
<exclude>junit:junit</exclude>
</excludes>
<includes>
<include>log4j:log4j:jar</include>
</includes>
</artifactSet>
<!-- 包含或排除依赖jar包内部资源 -->
<filters>
<filter>
<!-- 处理的jar包坐标,支持通配符 -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
<filter>
<artifact>junit:junit</artifact>
<includes>
<include>org/junit/**</include>
</includes>
</filter>
</filters>
</configuration>
</execution>
</executions>
有时依赖的多个jar包中可能会有重名类,可以通过此配置解决
relocation
将指定的包名重命名为新包名后再打包<executions>
<execution>
<configuration>
<relocations>
<relocation>
<!-- 解决依赖冲突,将原始的 com.source 包打包为 com.target.source -->
<pattern>com.source</pattern>
<shadedPattern>com.target.source</shadedPattern>
<excludes>
<!-- 排除指定的类不进行重命名 -->
<exclude>com.source.ExcludeClass</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
依赖的jar包中会存在同名的各类资源文件,此项配置可以将资源文件进行合并
transformers
使用不同的转换器将不同种类的资源文件进行合并 官方文档ManifestResourceTransformer
jar包清单文件设置,打印可执行jar包只需在此处配置主类入口即可 官方文档AppendingTransformer
合并依赖jar包中的同名属性文件,如spring-context和plexus-spring两个jar包中都包含META-INF/spring.handlers 官方文档XmlAppendingTransformer
合并xml类型文件 官方文档ResourceBundleAppendingTransformer
合并properties资源配置文件 官方文档<executions>
<execution>
<configuration>
<!-- 处理各类重名资源文件的转换器
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html -->
<transformers>
<!-- ManifestResourceTransformer: 对mainfest文件进行配置 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 指定入口类,此为打包可执行jar包的主要配置信息
http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html -->
<mainClass>com.example.MainApp</mainClass>
</transformer>
<!-- AppendingTransformer: 合并依赖jar包中的同名属性文件,防止解压打包时同名文件被覆盖
如spring-context和plexus-spring两个jar包中都包含META-INF/spring.handlers,使用该配置可以将两个文件进行合并
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#AppendingTransformer -->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<!-- XmlAppendingTransformer: 与AppendingTransformer类似,用于处理xml文件
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#XmlAppendingTransformer -->
<transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>META-INF/magic.xml</resource>
<!-- 自1.3.1版本开始,默认不加载DTD文件以避免网络访问,此项可以开启加载 -->
<!-- <ignoreDtd>false</ignoreDtd> -->
</transformer>
<!-- ResourceBundleAppendingTransformer: 配置 properties 资源配置文件
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ResourceBundleAppendingTransformer -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ResourceBundleAppendingTransformer">
<!-- 资源文件路径 -->
<basename>path/to/Messages</basename>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
若需要可执行jar包,只需要设置清单文件的 Main-Class 属性指定入口类即可,官方文档
参考 3.解决资源文件冲突
<executions>
<execution>
<configuration>
<transformers>
<!-- ManifestResourceTransformer: 对mainfest文件进行配置 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 指定入口类,此为打包可执行jar包的主要配置信息
http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html -->
<mainClass>com.example.MainApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
若想减少jar包体积,可以配置此项
minimizeJar
最小化打包,即解压打包时将没有使用到的类排除<executions>
<execution>
<configuration>
<!-- 最小化打包,即解压打包时将没有使用到的依赖jar包中的类排除 -->
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
shadedClassifierName
默认打出的jar包名字最后带有 -shade 后缀,此项可以对此进行修改<executions>
<execution>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<!-- 默认打出的jar包名字最后带有 -shade 后缀,此项可以对此进行修改 -->
<shadedClassifierName>anyname</shadedClassifierName>
</configuration>
</execution>
</executions>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<!-- 不生成dependency-reduced-pom.xml文件 -->
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- 最小化打包,即解压打包时将没有使用到的依赖jar包中的类排除 -->
<minimizeJar>true</minimizeJar>
<shadedArtifactAttached>true</shadedArtifactAttached>
<!-- 默认打出的jar包名字最后带有 -shade 后缀,此项可以对此进行修改 -->
<shadedClassifierName>anyname</shadedClassifierName>
<!-- 处理各类重名资源文件的转换器
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html -->
<transformers>
<!-- ManifestResourceTransformer: 对mainfest文件进行配置 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 指定入口类,此为打包可执行jar包的主要配置信息
http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html -->
<mainClass>me.learn.App</mainClass>
</transformer>
<!-- AppendingTransformer: 合并引用jar包中的同名属性文件,防止解压打包时同名文件被覆盖
如spring-context和plexus-spring两个jar包中都包含META-INF/spring.handlers,使用该配置可以将两个文件进行合并
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#AppendingTransformer -->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tld</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring-form.tld</resource>
</transformer>
<!--排除掉指定资源文件-->
<!--<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>不需要的资源文件</resource>
</transformer>-->
<!--将项目下的文件file额外加到resource中-->
<!--<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/pom_test</resource>
<file>pom.xml</file>
</transformer>-->
<!--整合spi服务中META-INF/services/文件夹的相关配置-->
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<!-- XmlAppendingTransformer: 与AppendingTransformer类似,用于处理xml文件
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#XmlAppendingTransformer -->
<transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>META-INF/magic.xml</resource>
<!-- 自1.3.1版本开始,默认不加载DTD文件以避免网络访问,此项可以开启加载 -->
<!-- <ignoreDtd>false</ignoreDtd> -->
</transformer>
<!-- ResourceBundleAppendingTransformer: 配置 properties 资源配置文件
http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ResourceBundleAppendingTransformer -->
<!--<transformer implementation="org.apache.maven.plugins.shade.resource.ResourceBundleAppendingTransformer">
<!– 资源文件路径 –>
<basename>path/to/Messages</basename>
</transformer>-->
</transformers>
<relocations>
<relocation>
<!-- 解决依赖冲突,将原始的 com.source 包打包为 com.target.com.source -->
<pattern>com.source</pattern>
<shadedPattern>com.target.com.source</shadedPattern>
<excludes>
<!-- 排除指定的类不进行重命名 -->
<exclude>com.source.ExcludeClass</exclude>
</excludes>
</relocation>
</relocations>
<!-- 包含或排除依赖jar包,支持通配符 -->
<artifactSet>
<excludes>
<exclude>junit:junit</exclude>
</excludes>
<!--<includes>
<include>log4j:log4j:jar</include>
</includes>-->
</artifactSet>
<!-- 包含或排除依赖jar包内部资源 -->
<filters>
<filter>
<!-- 处理的jar包坐标,支持通配符 -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
<!--<filter>
<artifact>junit:junit</artifact>
<includes>
<include>org/junit/**</include>
</includes>
</filter>-->
</filters>
</configuration>
</execution>
</executions>
</plugin>
一个Spring Boot项目的pom.xml备份,根据需要进行删减
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- JDK版本 -->
<jdk.version>1.8</jdk.version>
<maven.compiler.target>${jdk.version}</maven.compiler.target>
<maven.compiler.source>${jdk.version}</maven.compiler.source>
<maven.compiler.compilerVersion>${jdk.version}</maven.compiler.compilerVersion>
<!-- 项目编码 -->
<project.encoding>UTF-8</project.encoding>
<maven.compiler.encoding>${project.encoding}</maven.compiler.encoding>
<project.source.encoding>${project.encoding}</project.source.encoding>
<project.build.sourceEncoding>${project.encoding}</project.build.sourceEncoding>
<project.reporting.outputEncoding>${project.encoding}</project.reporting.outputEncoding>
<!-- Plugins 版本 -->
<maven.war.plugin.version>3.6</maven.war.plugin.version>
<!--maven-compiler-plugin 版本-->
<maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
<!--maven-jar-plugin版本-->
<maven.jar.plugin.version>3.2.0</maven.jar.plugin.version>
<!--onejar-maven-plugin版本-->
<onejar.plugin.version>1.4.4</onejar.plugin.version>
<!-- Jar版本 -->
</properties>
<!--修改build下面的finalName-->
<build>
<!--修改finalName 就可以将web名称修改掉-->
<!-- <finalName>/</finalName> -->
<!-- <finalName>${project.artifactId}</finalName> -->
<plugins>
<!-- 打包war包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven.war.plugin.version}</version>
<configuration>
<!-- 配置war包的名称,需要和上面统一,默认和finalName是统一的,一般不用配置,我只是显得蛋疼,所以配置一个玩 -->
<!-- <warName>test</warName> -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<!-- 源代码使用的开发版本 -->
<source>${java.version}</source>
<!-- 需要生成的目标class文件的编译版本 -->
<target>${java.version}</target>
<!-- 字符集编码 -->
<encoding>${project.encoding}</encoding>
<!-- 手动指定的javac命令路径 -->
<!-- <executable>${java.home}/bin/javac</executable> -->
<!-- 是否输出所有的编译信息(包括类的加载等)-->
<!--<verbose>false</verbose>-->
<!--是否显示警告信息-->
<!--<showWarnings>true</showWarnings>-->
<!-- 编译器使用的初始内存 -->
<!--<meminitial>128m</meminitial>-->
<!-- 编译器使用的最大内存 -->
<!--<maxmem>512m</maxmem>-->
<compilerArgs>
<!-- 显示过期方法的警告级别信息-->
<!--<arg>-Xlint:deprecation</arg>-->
<!-- 跳过测试,不需要value,直接闭合标签 -->
<skipTests />
</compilerArgs>
<!--这个选项用来传递编译器自身不包含但是却支持的参数选项-->
<compilerArguments>
<!-- 如果使用了 rt.jar或者jce.jar 中的信息需要手动导入,比如 rt.jar 中的@NotNull注解 -->
<bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
<!-- spring boot默认打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven.jar.plugin.version}</version>
<configuration>
<archive>
<!-- 添加maven 描述,是否包含pom.xml和pom.properties等文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!--程序入口类-->
<mainClass>com.example.MainApp</mainClass>
<!--<mainClass>me.learn.utils.JarUtils</mainClass>-->
<!--将依赖jar加入清单文件Class-path-->
<addClasspath>true</addClasspath>
<!--清单文件中Class-path路径-->
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
<excludes>
<!-- 过滤掉不希望包含在jar中的文件 -->
<exclude>**/assembly/</exclude>
<exclude>**/META-INF/</exclude>
<!--<exclude>**/logback-test.xml</exclude>-->
</excludes>
</configuration>
</plugin>
<!-- 使用 onejar-maven-plugin 插件生成 all-in-one jar包-->
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>${onejar.plugin.version}</version>
<executions>
<execution>
<configuration>
<!--程序入口,配合maven-jar-plugin插件使用时不需要,单独使用时自己的jar包不会添加classpath-->
<!--<mainClass>com.example.MainApp</mainClass>-->
<attachToBuild>true</attachToBuild>
<classifier>onejar</classifier>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>