如何通过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
相关产品推荐
相关产品推荐

