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
相关产品推荐
相关产品推荐

