如何在Maven打包时将依赖Jar包嵌入最终目标Jar包
解决方案:将依赖Jar打包到最终Jar根目录
核心问题分析
你当前使用的maven-assembly-plugin默认jar-with-dependencies描述符会将依赖包的类文件解压合并到最终Jar中,而非保留原始Jar文件;同时maven-jar-plugin里的../*类路径配置无效(Maven资源扫描基于项目根目录,无法跨目录抓取文件),导致依赖Jar未被嵌入最终产物。
步骤1:自定义Assembly描述符
在项目根目录创建src/main/assembly/assembly.xml,用于指定打包规则,将依赖Jar原封不动放入最终Jar根目录:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> <id>jar-with-dependencies</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <!-- 打包项目自身编译后的类文件 --> <fileSet> <directory>${project.build.outputDirectory}</directory> <outputDirectory>/</outputDirectory> </fileSet> <!-- 打包项目资源文件 --> <fileSet> <directory>${project.basedir}/src/main/resources</directory> <outputDirectory>/resources</outputDirectory> </fileSet> </fileSets> <!-- 打包依赖Jar到最终Jar根目录,不解压 --> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>false</useProjectArtifact> <unpack>false</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
步骤2:调整Pom.xml插件配置
1. 更新maven-assembly-plugin(替换原配置)
使用自定义描述符,同时升级插件版本(老版本存在兼容性问题):
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <!-- 引用自定义描述符 --> <descriptors> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> <archive> <manifest> <mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</mainClass> </manifest> <manifestEntries> <Build-Version-ID>${cem.build.version.id}</Build-Version-ID> <Build-Timestamp>${timestamp}</Build-Timestamp> <Rsrc-Main-Class>gov.cms.ccem.releasetool.RVToolLauncher</Rsrc-Main-Class> <Rsrc-Class-Path>./ jakarta-oro-2.0.8.jar ${jarfile.commons.beanutils} ${jarfile.commons.logging} ${jarfile.commons.lang} ${jarfile.commons.text} ${jarfile.slf4j.api} ${jarfile.log4j.api} ${jarfile.log4j.core} ${jarfile.log4j.slf4j.impl}</Rsrc-Class-Path> <Class-Path>.</Class-Path> </manifestEntries> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
2. 修正maven-jar-plugin配置
移除无效的跨目录扫描规则,升级插件版本:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <includes> <include>gov/cms/ccem/releasetool/*</include> <include>resources/*</include> </includes> <excludes> <exclude>javax/**</exclude> </excludes> <archive> <manifest> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin>
3. 移除冗余的maven-dependency-plugin配置
Assembly插件可直接从Maven仓库获取依赖打包,无需提前复制到target目录,删除copy-dependencies执行块。
步骤3:验证打包结果
执行mvn clean package后,查看target/cem_rvtool.jar,根目录下应包含所有声明的依赖Jar文件,与Ant构建的产物一致。
内容的提问来源于stack exchange,提问作者rockzombie2
相关产品推荐
相关产品推荐

