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

如何通过Maven将依赖及递归依赖源码打包至Jar文件?

实现Maven打包所有依赖及递归源码Jar的方案

你当前的配置存在两个核心问题:一是手动添加直接依赖的sources条目无法覆盖递归依赖,二是默认的jar-with-dependencies描述符只会打包runtime scope的主Jar依赖,不会自动包含带sources classifier的依赖包。以下是可行的解决方法:

步骤1:移除手动添加的sources依赖

删掉pom.xml中所有带<classifier>sources</classifier>的依赖条目,后续将通过插件自动拉取所有递归依赖的sources包。

步骤2:配置自定义Assembly描述符

在项目根目录创建src/main/assembly/sources-included-jar.xml文件,内容如下:

<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-and-sources</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <!-- 打包项目本身和普通编译/运行时依赖 -->
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
    <!-- 打包所有带sources classifier的依赖(包括递归依赖) -->
    <dependencySet>
      <outputDirectory>/sources</outputDirectory>
      <unpack>true</unpack>
      <classifier>sources</classifier>
      <scope>compile</scope>
    </dependencySet>
  </dependencySets>
</assembly>

该描述符会将普通依赖解压到Jar根目录,源码依赖解压到sources子目录,避免和编译后的class文件混淆。如果需要把源码和class文件放在同一目录,只需将第二个dependencySet的outputDirectory改为/即可。

步骤3:修改maven-assembly-plugin配置

替换原有的assembly插件配置,使用自定义描述符:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <archive>
              <manifest>
                <mainClass>cf.teladi.Main</mainClass>
              </manifest>
            </archive>
            <descriptors>
              <descriptor>src/main/assembly/sources-included-jar.xml</descriptor>
            </descriptors>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

注意事项

  • 若某个依赖未发布对应的sources Jar,Maven无法自动获取,这种情况无法强制解决,只能联系依赖提供者或自行编译源码。
  • 执行mvn package后,生成的Jar文件会包含项目本身、所有递归依赖的class文件,以及所有能获取到的依赖源码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:50