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

如何在IntelliJ中为两个依赖包生成独立Jar文件?

嘿,这个问题我之前帮好几个开发者捋清楚过——你之所以生成的两个Jar内容完全一样,核心原因是打包时没精准限定要包含的包路径,导致每次都把所有class文件一股脑打进去了。下面给你几种靠谱的实现方式,按需选就行:

方法一:使用原生jar命令手动打包

如果只是临时需求,用JDK自带的jar命令就能快速搞定,关键是要精准指定要打包的包路径:

  • 先确保你的编译后的class文件结构是标准的,比如编译输出到target/classes目录,里面有com/example/A和com/example/B两个子目录(对应两个包)
  • 打包jar_A.jar(仅包含com.example.A):在项目根目录执行以下命令,记得替换清单文件路径和class文件目录:
    jar cvfm jar_A.jar MANIFEST_A.MF -C target/classes com/example/A/
    
    解释:-C参数是切换到指定的class文件目录,后面跟着的com/example/A/就是要打包的具体范围,这样只会把A包下的所有class文件打包进去
  • 打包jar_B.jar同理,只需要把路径换成com/example/B/:
    jar cvfm jar_B.jar MANIFEST_B.MF -C target/classes com/example/B/
    
    小贴士:如果jar_B依赖jar_A,可以在MANIFEST_B.MF里添加Class-Path: jar_A.jar,这样运行时能自动找到依赖的Jar
方法二:用Maven分模块构建(适合长期维护的项目)

如果你的项目是用Maven管理的,拆成两个子模块是更优雅的方案,从根源上避免混包:

  1. 把项目改成多模块结构,在父项目的pom.xml里声明两个子模块:
    <modules>
        <module>module-A</module>
        <module>module-B</module>
    </modules>
    
  2. 子模块module-A的代码只保留com.example.A包的内容,它的pom.xml负责打包成独立Jar;如果module-B依赖module-A,就在module-B的pom.xml里添加依赖:
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>module-A</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    
  3. 执行mvn clean package,每个子模块的target目录下就会生成各自独立的Jar,完全不会出现内容重复的问题
方法三:用Gradle配置多Jar任务

如果是Gradle项目,直接在build.gradle里定义两个独立的Jar任务,分别指定不同的包范围:

// 生成仅包含com.example.A的Jar
tasks.register('jarA', Jar) {
    archiveFileName = 'jar_A.jar'
    from sourceSets.main.output  // 指向编译后的class文件
    include 'com/example/A/**'   // 只包含A包的所有文件
    // 自定义清单(如果需要的话)
    manifest {
        attributes 'Main-Class': 'com.example.A.Main',
                   'Class-Path': 'jar_B.jar'  // 若有依赖可配置
    }
}

// 生成仅包含com.example.B的Jar
tasks.register('jarB', Jar) {
    archiveFileName = 'jar_B.jar'
    from sourceSets.main.output
    include 'com/example/B/**'
    manifest {
        attributes 'Class-Path': 'jar_A.jar'
    }
}

执行./gradlew jarA jarB(Windows用gradlew.bat jarA jarB),就能在build/libs目录下得到两个完全独立的Jar了

额外注意点

  • 打包前一定要先清理旧的编译文件(比如Maven的mvn clean、Gradle的./gradlew clean,或者手动删除target/build目录),避免残留文件导致Jar内容重复
  • 命令行打包时,千万不要直接用jar cvf jar_A.jar target/classes/com,这样会把整个com目录打包进去,一定要精准到具体的包路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:07:17