如何通过Maven正确依赖jar-with-dependencies(Fat Jar)
本地仓库结构
aaa/0.1.0-SNAPSHOT -- aaa-0.1.0-20231216.113327-1.jar -- aaa-0.1.0-20231216.113327-1.pom -- aaa-0.1.0-SNAPSHOT-jar-with-dependencies.jar
POM依赖配置
<dependency> <groupId>com.xxx.yyy</groupId> <artifactId>aaa</artifactId> <version>0.1.0-SNAPSHOT</version> <classifier>jar-with-dependencies</classifier> </dependency>
报错信息
编译时报错:The POM for com.xxx.yyy:aaa:jar:jar-with-dependencies:1.1.0.33-SNAPSHOT is missing, no dependency information available
本地仓库已下载aaa-0.1.0-SNAPSHOT-jar-with-dependencies.jar,但缺少aaa-0.1.0-SNAPSHOT.jar和aaa-0.1.0-SNAPSHOT.pom,需解决如何正确使用带jar-with-dependencies classifier的快照依赖。
解决方案
1. 排查版本一致性问题
报错中出现的版本1.1.0.33-SNAPSHOT与配置的0.1.0-SNAPSHOT不一致,先检查项目是否存在其他依赖引用错误版本导致冲突。可执行mvn dependency:tree查看依赖树,定位冲突来源。
2. 从构建源头生成对应classifier的快照POM
如果aaa是你维护的项目,需在其POM中配置maven-assembly-plugin,确保快照构建时同步生成并上传带classifier的POM:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <appendAssemblyId>true</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <attach>true</attach> <!-- 关键:将组装产物附加到构建,deploy时同步上传对应POM --> </configuration> </execution> </executions> </plugin>
重新执行mvn clean deploy发布快照版本,仓库会生成对应classifier的快照POM(如aaa-0.1.0-2023xxxx.xxxxx-x-jar-with-dependencies.pom),Maven即可正确识别依赖。
3. 本地仓库临时修复(不推荐长期使用)
若无法重新构建aaa项目,可手动修改本地仓库:
- 在
aaa/0.1.0-SNAPSHOT目录下,复制现有aaa-0.1.0-20231216.113327-1.pom,重命名为aaa-0.1.0-SNAPSHOT-jar-with-dependencies.pom - 编辑该目录下的
maven-metadata.xml,添加jar-with-dependenciesclassifier的快照条目,确保时间戳与现有文件匹配
完成后执行mvn clean install -U强制更新快照缓存。
4. 清理Maven缓存
执行mvn clean install -U,强制Maven更新快照依赖,重新拉取正确的POM和jar文件。
内容的提问来源于stack exchange,提问作者sw21

