自定义Maven打包插件依赖传递失效问题排查
问题分析与解决方案
我一眼就注意到你在自定义ArtifactHandler里设置了<includesDependencies>true</includesDependencies>,这正是导致依赖传递失效的核心原因!
为什么这个配置会出问题?
这个配置的作用是告诉Maven:你的myproj类型制品已经内置了所有依赖(类似Maven自带的jar-with-dependencies打包方式)。当Maven看到这个标记时,会自动跳过解析该依赖的传递依赖——这就是为什么cli项目的依赖树里看不到model,你的自定义Mojo也无法获取到这个依赖的根本原因。
修复步骤
- 修改你的自定义插件中
components.xml里的ArtifactHandler配置,将<includesDependencies>true</includesDependencies>改为<includesDependencies>false</includesDependencies>:
<component> <role>org.apache.maven.artifact.handler.ArtifactHandler</role> <role-hint>myproj</role-hint> <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation> <configuration> <type>myproj</type> <extension>myproj</extension> <packaging>myproj</packaging> <addedToClasspath>true</addedToClasspath> <!-- 关键修改:改为false,恢复正常依赖传递 --> <includesDependencies>false</includesDependencies> </configuration> </component>
- 重新安装依赖链上的项目,确保修改生效:
# 先清理并安装model项目 cd model mvn clean install # 再清理并安装model-impl项目 cd ../model-impl mvn clean install
- 验证修复效果:
在cli项目目录下执行依赖树命令:
mvn dependency:dependency-tree
此时你应该能看到完整的三级依赖树:
[INFO] com.corp.nodes:myproj-cli:myproj:1.0.0-SNAPSHOT [INFO] \- com.corp.:myproj-model-impl:myproj:1.0.0-SNAPSHOT:compile [INFO] \- com.corp.:myproj-model:myproj:1.0.0-SNAPSHOT:compile
同时你的自定义Mojo也应该能正常获取到model依赖了。
额外说明
如果之后你需要制作包含所有依赖的myproj制品(类似胖包),建议单独实现一个自定义打包目标(比如package-with-deps),而不是修改全局的ArtifactHandler配置——这样既能满足特殊打包需求,又不会破坏正常的依赖传递逻辑。
内容的提问来源于stack exchange,提问作者Matt McMinn
相关产品推荐
相关产品推荐

