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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:52:06