当前位置: 首页 > 工具软件 > One-JAR > 使用案例 >

Maven pom.xml文件配置示例 可执行单jar包 shade-plugin one-jar

史高阳
2023-12-01

Maven pom.xml文件示例 打包单jar包

常用的 pom.xml 文件配置记录

一.打包为一个jar包

有时为了方便使用会将包括依赖的第三方jar在内的整个项目打包为一个jar包

1.one-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>

2.maven-shade-plugin

maven-shade-plugin 是官方提供的一个打包插件,可定制性高,功能丰富,但是相应的学习成本较 one-jar 要高一些

打包时会将依赖jar包解压,只提取class文件

官方文档

1.依赖jar包排除/或指定包括

默认会全部打包,通过该配置可以手动指定排除或包含哪些依赖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>

2.解决依赖冲突

有时依赖的多个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>

3.解决资源文件冲突

依赖的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>

4.可执行jar包

若需要可执行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>

5.最小化打包

若想减少jar包体积,可以配置此项

  • minimizeJar 最小化打包,即解压打包时将没有使用到的类排除
<executions>
    <execution>
        <configuration>
            <!-- 最小化打包,即解压打包时将没有使用到的依赖jar包中的类排除 -->
            <minimizeJar>true</minimizeJar>
        </configuration>
    </execution>
</executions>

6.修改最终jar包名后缀

  • shadedClassifierName 默认打出的jar包名字最后带有 -shade 后缀,此项可以对此进行修改
<executions>
    <execution>
        <configuration>
            <shadedArtifactAttached>true</shadedArtifactAttached>
            <!-- 默认打出的jar包名字最后带有 -shade 后缀,此项可以对此进行修改 -->
            <shadedClassifierName>anyname</shadedClassifierName>
        </configuration>
    </execution>
</executions>

7.整合示例

<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">
            &lt;!&ndash; 资源文件路径 &ndash;&gt;
            <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>

二.pom.xml文件备份

一个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>
 类似资料: