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

多模块项目中创建含依赖的非可执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:01:22