多模块项目中创建含依赖的非可执行JAR方法及POM配置咨询
嘿,我来帮你解决这个多模块Maven打包的问题!要创建包含所有依赖的非可执行JAR包,其实用Maven的两个常用插件就能搞定,我给你详细说说两种可行的配置方案,还有多模块场景下的注意事项:
方案一:使用
maven-assembly-plugin 这个插件是Maven官方提供的打包工具,能快速将项目代码和所有依赖打包成一个完整的JAR,很适合多模块场景。
在你需要打包的子模块POM文件中添加以下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>package-with-deps</id> <!-- 绑定到package阶段,执行mvn package时自动触发 --> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <!-- 不要配置mainClass,确保生成非可执行JAR --> <archive> </archive> <!-- 使用预定义的"包含所有依赖"的打包规则 --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 开启多模块依赖包含,确保子模块的依赖模块也被打包进来 --> <includeModuleDependencies>true</includeModuleDependencies> <!-- 自定义最终JAR的名称,方便区分普通JAR和带依赖的JAR --> <finalName>${project.artifactId}-${project.version}-with-deps</finalName> </configuration> </execution> </executions> </plugin> </plugins> </build>
配置完成后,在该子模块目录下执行mvn clean package,就能在target目录下找到命名为xxx-with-deps.jar的包,里面包含了当前模块的代码和所有依赖(包括其他子模块的代码)。
方案二:使用
maven-shade-plugin 这个插件比assembly插件更灵活,能处理依赖冲突、重命名包路径等复杂场景,同样适合多模块项目。
在目标子模块的POM中添加以下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 不配置mainClass,保证非可执行 --> <!-- 生成一个附加的带依赖JAR,不覆盖原有的普通模块JAR --> <shadedArtifactAttached>true</shadedArtifactAttached> <!-- 附加JAR的后缀,比如xxx-with-deps.jar --> <shadedClassifierName>with-deps</shadedClassifierName> <!-- 可选:过滤掉签名文件,避免打包后出现签名验证问题 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,target目录会生成两个JAR:一个是普通的模块JAR,另一个是带-with-deps后缀的包含所有依赖的JAR。
多模块项目的注意事项
- 不要在父POM中统一配置这些插件,只在需要生成带依赖JAR的子模块中添加配置,避免所有模块都生成冗余包。
- 确保父POM已经正确声明了子模块的依赖关系,执行打包时Maven会自动构建当前模块依赖的其他子模块。
- 如果依赖的模块是
provided范围,这类依赖不会被打包进JAR,若需要包含请调整依赖范围为compile。
内容的提问来源于stack exchange,提问作者RoboFlax
相关产品推荐
相关产品推荐

