Maven自定义插件构建异常:单个项目触发maven-plugin-plugin:3.2:descriptor失败
为扩展Maven功能,我为所有自定义Maven插件创建了父POM,并基于该父POM开发了两个插件。其中VersionSplitter-Plugin可成功构建,但FileSize-Plugin在执行maven-plugin-plugin:3.2:descriptor目标时失败,错误信息为:
Execution default-descriptor of goal org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor failed: 52264
且只要在execute()方法中执行除getLog()外的操作,该插件就会构建失败。无法发现两个项目的差异,恳请帮忙排查问题。
相关配置与代码
父POM
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.company.maven</groupId> <artifactId>MavenPluginsParent</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <properties> <maven.api.version>3.6.0</maven.api.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>Cp1252</project.build.sourceEncoding> <project.reporting.outputEncoding>Cp1252</project.reporting.outputEncoding> <maven.build.timestamp.format>YYYYMMddHHmm</maven.build.timestamp.format> <application.build.version>${maven.build.timestamp}</application.build.version> </properties> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>${maven.api.version}</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-project</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>${maven.api.version}</version> <scope>provided</scope> </dependency> </dependencies> </project>
失败项目(FileSize-Plugin)
POM文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>FileSize-Plugin</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>maven-plugin</packaging> <parent> <groupId>my.company.maven</groupId> <artifactId>MavenPluginsParent</artifactId> <version>1.0.0</version> </parent> </project>
Java类
import java.io.File; import java.util.Optional; import java.util.Properties; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; @Mojo(name = "FileSize", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresProject = true) public class FileSizeMojo extends AbstractMojo { @Parameter(readonly = true, required = true) private File targetFile; @Parameter(defaultValue = "file.size", readonly = true, required = false) private String destPropertyName; @Parameter(defaultValue = "${project}", required = true, readonly = true) private MavenProject project; @Override public void execute() throws MojoExecutionException { // do something String.valueOf(0); } }
成功项目(VersionSplitter-Plugin)
POM文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>VersionSplitter-Plugin</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>maven-plugin</packaging> <parent> <groupId>my.company.maven</groupId> <artifactId>MavenPluginsParent</artifactId> <version>1.0.0</version> </parent> </project>
Java类
import java.util.Optional; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; @Mojo(name = "VersionSplitter", defaultPhase = LifecyclePhase.INITIALIZE, requiresProject = true) public class VersionSplitterMojo extends AbstractMojo { @Parameter(defaultValue = "${project}", required = true, readonly = true) private MavenProject project; @Override public void execute() throws MojoExecutionException { // do something String.valueOf(0); } }
核心问题
两个插件的差异在于FileSize-Plugin多了File类型的参数,而你使用的maven-plugin-plugin:3.2版本过于老旧,无法兼容Maven 3.6.0的API;同时父POM中存在依赖版本冲突(maven-project:2.2.1是Maven 2.x依赖,与3.6.0的API不兼容),导致生成插件描述符时失败。
具体修复步骤
1. 升级maven-plugin-plugin版本
在父POM中添加pluginManagement配置,将插件版本与maven.api.version对齐:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>${maven.api.version}</version> </plugin> </plugins> </pluginManagement> </build>
2. 替换冲突依赖
将父POM中的maven-project依赖替换为Maven 3.x对应的maven-core:
<!-- 移除旧的maven-project依赖 --> <!-- <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-project</artifactId> <version>2.2.1</version> </dependency> --> <!-- 添加maven-core依赖 --> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-core</artifactId> <version>${maven.api.version}</version> </dependency>
注:Maven 3.x之后,maven-project模块已被maven-core替代,无需再引入旧依赖。
3. 清理并重新构建
执行以下命令清理缓存并重新构建:
mvn clean install
完成以上步骤后,FileSize-Plugin的maven-plugin-plugin:descriptor目标即可正常执行。
内容的提问来源于stack exchange,提问作者Timothy Truckle

