Maven多模块项目依赖未打入Jar包问题咨询
问题分析与解决
你的核心误解在于:Maven的compile scope(未指定时的默认scope)仅控制依赖在编译、测试、运行阶段的可用性,但默认的maven-jar-plugin并不会自动把依赖Jar打入当前模块生成的Jar包中。默认插件只负责打包当前模块编译后的class文件与资源文件,依赖Jar仅会保留在本地仓库或项目依赖路径中,不会被嵌入到最终Jar里。
为什么依赖没被打入Jar?
- 默认打包插件的限制:
maven-jar-plugin是Maven打包Jar的默认插件,它的职责仅为打包当前模块的编译产物(src/main/java、src/main/resources下的内容),不会处理依赖的嵌入逻辑。 - 多模块项目的依赖逻辑:如果
CR_RAPDEV_BE_PRODO_DEBICLIENT_V1是你多模块项目中的另一个模块,Maven会在编译当前模块时自动关联它,但依然不会将其Jar嵌入到当前模块的Jar中——多模块项目通常是各模块独立打包,运行时通过类路径关联依赖。
如何把依赖打入Jar?
如果确实需要将依赖Jar嵌入到当前模块的Jar中,可以使用以下插件实现:
1. 使用maven-shade-plugin(推荐)
这个插件可以将依赖的class文件合并到当前Jar中,也可生成包含所有依赖的可执行Jar。在模块的pom.xml中添加配置:
<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> <!-- 可选:设置主类,生成可执行Jar --> <!-- <mainClass>com.your.package.MainClass</mainClass> --> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,生成的Jar会包含所有依赖的class文件。
2. 使用maven-assembly-plugin
这个插件可通过自定义描述符打包包含依赖的Jar,适合更复杂的打包需求:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 可选:设置主类 --> <!-- <archive> <manifest> <mainClass>com.your.package.MainClass</mainClass> </manifest> </archive> --> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行打包命令后,会生成一个后缀为-jar-with-dependencies.jar的文件,包含所有依赖Jar的内容。
内容的提问来源于stack exchange,提问作者fraaanz
相关产品推荐
相关产品推荐

