You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:01:28