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

IntelliJ中如何将多模块项目的每个模块打包为独立Jar包?

嘿,这个问题我太熟了!多模块项目生成独立Jar其实在Maven和Gradle这俩主流构建工具里都有非常成熟的方案,我给你分情况掰扯清楚:

一、用Maven生成独立模块Jar
  • 默认就自带独立Jar生成:Maven多模块项目(父POM+子模块结构),只要你执行mvn clean install,每个子模块(包括主模块和支持模块)都会在自己的target目录下生成对应的Jar文件,完全独立,不需要额外配置就能用。
  • 想自定义Jar?改插件就行:如果需要调整Jar的名称、包含/排除文件,可以在每个子模块的pom.xml里配置maven-jar-plugin,举个例子:
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.3.0</version>
      <configuration>
        <!-- 自定义Jar的最终名称 -->
        <finalName>${project.artifactId}-${project.version}-release</finalName>
        <!-- 排除测试相关的文件 -->
        <excludes>
          <exclude>**/test/**</exclude>
        </excludes>
      </configuration>
    </plugin>
  </plugins>
</build>
  • 要不要调整输出布局?看需求:默认每个模块的Jar在各自的target文件夹里,如果你想把所有Jar统一放到项目根目录的某个地方(比如dist文件夹),可以在父POM里加个maven-antrun-plugin来复制文件:
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>3.1.0</version>
      <executions>
        <execution>
          <phase>install</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <tasks>
              <!-- 创建根目录下的dist文件夹 -->
              <mkdir dir="${project.basedir}/dist"/>
              <!-- 复制所有模块的Jar到dist,排除源码包和测试包 -->
              <copy todir="${project.basedir}/dist">
                <fileset dir="${project.basedir}" includes="**/target/*.jar"/>
                <exclude name="**/target/*-sources.jar"/>
                <exclude name="**/target/*-tests.jar"/>
              </copy>
            </tasks>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
二、用Gradle生成独立模块Jar
  • 默认行为同样友好:Gradle多模块项目里,每个模块都自带jar任务,执行./gradlew clean build后,每个模块的build/libs目录下都会产出独立的Jar文件,主模块和支持模块的产物完全分开。
  • 自定义Jar配置也简单:如果要改Jar的名字、内容,直接在模块的build.gradle(或Kotlin版的build.gradle.kts)里调整jar任务就行:
// Groovy DSL示例
jar {
    // 自定义Jar的基础名称和版本
    archiveBaseName.set("my-service-module")
    archiveVersion.set("1.0.0")
    // 排除不需要的文件
    exclude("**/test/**")
    // 额外添加自定义资源目录的内容
    from("src/main/resources/config")
}
// Kotlin DSL示例
tasks.jar {
    archiveBaseName.set("my-service-module")
    archiveVersion.set("1.0.0")
    exclude("**/test/**")
    from("src/main/resources/config")
}
  • 统一输出布局的小技巧:要是想把所有模块的Jar都集中到根目录的dist文件夹,在根项目的build.gradle里加个自定义任务就行:
// Groovy DSL示例
task copyAllJars(type: Copy) {
    // 指定输出目录为根项目下的dist
    into "${rootProject.projectDir}/dist"
    // 遍历所有子模块,复制它们的Jar产物
    subprojects {
        from it.tasks.jar.outputs.files
        // 排除源码包和测试Jar
        exclude "*-sources.jar", "*-tests.jar"
    }
}
// 让这个任务依赖所有模块的build任务,确保先构建再复制
copyAllJars.dependsOn subprojects.build

执行./gradlew copyAllJars,所有模块的Jar就都会跑到根目录的dist里了。

三、到底要不要调整输出布局?
  • 默认布局够用的场景:如果只是自己开发、测试用,默认的每个模块单独存放Jar的方式完全没问题,不会混淆不同模块的产物。
  • 建议调整的情况:
    • 要把Jar打包给部署团队,统一目录更方便分发;
    • 有自动化部署流程,统一输出目录更方便脚本抓取产物;
    • 需要区分不同环境的Jar(比如dev/prod),可以通过自定义任务生成不同的输出目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:57:45