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

Maven打包带依赖Jar时Manifest配置缺失问题排查

问题原因与解决方法

问题根源

maven-jar-plugin 和 maven-assembly-plugin 是两个独立的 Maven 插件,各自管理自身生成的 JAR 包的 Manifest 配置。你在 maven-jar-plugin 中设置的 Main-Class 和 Multi-Release 只会作用于它生成的普通 JAR,assembly 插件默认不会复用这些配置,所以生成的带依赖胖 JAR 会缺失这些条目。

解决方法

有两种方式可以让 assembly 生成的胖 JAR 带上指定的 Manifest 配置:

方式一:在 assembly 插件中显式配置 Manifest

直接在 maven-assembly-plugin 的配置里添加 <archive> 节点,手动指定主类和 Multi-Release 条目,和你配置 maven-jar-plugin 的方式类似:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.5.1</version> <!-- 使用较新的版本避免潜在问题 -->
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <!-- 添加 archive 配置指定 Manifest 信息 -->
    <archive>
      <manifest>
        <mainClass>com.main.App</mainClass>
      </manifest>
      <manifestEntries>
        <Multi-Release>true</Multi-Release>
      </manifestEntries>
    </archive>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

方式二:复用 maven-jar-plugin 生成的 Manifest 文件

如果不想重复配置,可以让 assembly 插件直接引用 jar 插件已经生成的 Manifest 文件,这个文件默认位于 ${project.build.outputDirectory}/META-INF/MANIFEST.MF:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.5.1</version>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <!-- 引用 jar 插件生成的 Manifest -->
      <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
    </archive>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

验证

重新执行 mvn clean package,生成的带依赖 JAR 包的 Manifest 就会包含你指定的 Main-Class 和 Multi-Release:true 条目了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:14:58