如何通过Java代码获取Maven有效POM包含默认插件在内的全部插件
问题原因
你缺失的4个插件是Maven为对应打包类型(如jar、war)默认绑定的生命周期内置插件,默认的ModelBuilder不会将这类插件纳入有效模型的插件列表:
ModelBuilder的默认构建逻辑仅处理三类插件:当前POM显式声明的插件、父POM/依赖管理节点继承的插件、激活Profile引入的插件,不会主动加载对应打包类型的生命周期默认绑定插件help:effective-pom输出的插件列表做了额外处理:它会将默认生命周期绑定的插件合并到输出结果中,所以你在命令行能看到这4个插件- 你尝试的
setProcessPlugins(true)配置仅用于处理插件配置的继承、合并和参数插值,不涉及默认生命周期插件的注入逻辑
解决方法
方案1(推荐):使用ProjectBuilder替代原生ModelBuilder
ProjectBuilder是Maven加载项目时实际使用的核心组件,会自动合并默认生命周期绑定的插件到构建插件列表,示例代码如下:
// 若在Maven插件环境可直接通过@Inject注入,非插件环境可从Maven容器获取实例 ProjectBuilder projectBuilder = ...; ProjectBuildingRequest request = new DefaultProjectBuildingRequest() .setRepositorySession(projectBuildingRequest.getRepositorySession()) .setRemoteRepositories(project.getRemoteProjectRepositories()) .setProcessPlugins(true); ProjectBuildingResult buildResult = projectBuilder.build(projectPom, request); MavenProject mavenProject = buildResult.getProject(); // 此处获取的插件列表已包含所有默认绑定插件 List<Plugin> fullPlugins = mavenProject.getBuildPlugins();
方案2:手动补充生命周期默认绑定插件
如果必须使用ModelBuilder,可额外拉取当前打包类型的生命周期映射,将默认绑定的插件合并到已有列表:
- 从
ModelBuilder生成的有效模型中获取packaging属性值 - 通过Maven容器获取对应
packaging的LifecycleMapping实例 - 提取
LifecycleMapping中绑定的所有插件,与已获取的插件列表合并去重即可
内容的提问来源于stack exchange,提问作者oliaaa_s
相关产品推荐
相关产品推荐

