You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Maven Assembly插件覆盖Java库类

解决Maven Assembly打包时自定义类无法覆盖依赖Jar类的问题

方法1:修改Assembly插件的合并策略

在pom.xml的Assembly插件配置中添加合并规则,指定同名.class文件用项目编译的版本覆盖依赖Jar中的版本:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.6.0</version>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <manifest>
        <mainClass>你的主类全限定名</mainClass>
      </manifest>
    </archive>
    <mergeStrategies>
      <mergeStrategy>
        <pattern>**/*.class</pattern>
        <strategy>override</strategy>
      </mergeStrategy>
    </mergeStrategies>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

这个配置会让Assembly插件遇到同名类时直接替换,跳过already added, skipping的提示。

方法2:自定义Assembly描述文件调整打包顺序

创建自定义的Assembly描述文件(比如src/main/assembly/assembly.xml),先解压所有依赖Jar的内容,再将项目编译后的自定义类复制进去实现覆盖:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  
  <!-- 先解压所有依赖Jar到打包目录 -->
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <unpack>true</unpack>
    </dependencySet>
  </dependencySets>
  
  <!-- 再复制项目编译后的类,覆盖同名文件 -->
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>**/*.class</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

然后在pom.xml中指定这个描述文件:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.6.0</version>
  <configuration>
    <descriptors>
      <descriptor>src/main/assembly/assembly.xml</descriptor>
    </descriptors>
    <archive>
      <manifest>
        <mainClass>你的主类全限定名</mainClass>
      </manifest>
    </archive>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

方法3:改用Maven Shade插件替代Assembly

Shade插件对类覆盖的支持更友好,可以通过排除依赖Jar中已修改的类,确保只打包自定义版本:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.5.1</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>你的主类全限定名</mainClass>
          </transformer>
        </transformers>
        <filters>
          <filter>
            <artifact>*:*</artifact>
            <excludes>
              <!-- 替换为你修改的类的全路径,多个类用逗号分隔 -->
              <exclude>com/example/your/modified/classes/**/*.class</exclude>
            </excludes>
          </filter>
        </filters>
      </configuration>
    </execution>
  </executions>
</plugin>

执行mvn package后,Shade插件会生成包含所有依赖和自定义类的可执行Jar,且自定义类会优先生效。

注意事项

  • 确保自定义类和依赖Jar中的类全类名完全一致(包括包路径),否则无法实现覆盖。
  • 打包完成后,可通过jar tf your-jar-file.jar命令查看Jar内的类,确认同名类只有自定义版本存在。
  • 无需全量反编译原Jar,仅保留修改的类即可,原Jar中未修改的类会被正常打包到最终产物中。

内容的提问来源于stack exchange,提问作者Pierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:40:28