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

如何通过Java API获取Maven项目的父POM及继承属性?

解决Maven子项目继承属性获取问题

核心方案:使用Maven Project Builder构建完整项目模型

Maven的org.apache.maven.project.MavenProject对象会自动处理父POM的继承、属性插值等原生逻辑,这是最健壮的解决方案。你可以借助DefaultProjectBuilder从本地文件系统的子POM构建出包含所有继承属性的MavenProject实例。

步骤1:引入必要依赖

如果你的项目用Maven管理,添加以下核心依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.9.6</version> <!-- 选用当前稳定版本 -->
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-model-builder</artifactId>
        <version>3.9.6</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.sisu</groupId>
        <artifactId>org.eclipse.sisu.plexus</artifactId>
        <version>0.3.5</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

步骤2:编写代码构建MavenProject

这段代码会自动从本地/远程仓库拉取父POM,生成包含所有继承属性的完整项目模型:

import org.apache.maven.project.MavenProject;
import org.apache.maven.project.DefaultProjectBuilder;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RepositoryPolicy;

import java.io.File;
import java.util.Collections;

public class MavenPropertyReader {
    public static void main(String[] args) throws Exception {
        // 1. 配置仓库会话:本地仓库+远程仓库
        DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
        // 指定本地仓库路径,默认取用户目录下的.m2/repository
        LocalRepository localRepo = new LocalRepository(System.getProperty("user.home") + "/.m2/repository");
        session.setLocalRepositoryManager(MavenRepositorySystemUtils.newServiceLocator()
                .getService(org.eclipse.aether.RepositorySystem.class)
                .newLocalRepositoryManager(session, localRepo));

        // 添加远程仓库(示例为Maven中央仓库,可替换为你的私有仓库)
        RemoteRepository central = new RemoteRepository.Builder("central", "default", "https://repo1.maven.org/maven2/")
                .setPolicy(true, new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_DAILY, RepositoryPolicy.CHECKSUM_POLICY_WARN))
                .build();

        // 2. 创建项目构建请求
        ProjectBuildingRequest request = new org.apache.maven.project.DefaultProjectBuildingRequest();
        request.setRepositorySession(session);
        request.setRemoteRepositories(Collections.singletonList(central));
        // 设置需要解析的子POM文件路径
        request.setPomFile(new File("/path/to/your/subproject/pom.xml"));

        // 3. 构建完整MavenProject实例
        DefaultProjectBuilder projectBuilder = new DefaultProjectBuilder();
        MavenProject project = projectBuilder.build(request).getProject();

        // 4. 获取继承并插值后的属性
        String jasperVersion = project.getProperties().getProperty("jasperreports.version");
        System.out.println("jasperreports.version: " + jasperVersion);
    }
}

关键说明

  • 该方法会自动下载父POM至本地仓库(如果本地不存在),无需手动指定父POM路径
  • MavenProject.getProperties()返回的是完成继承合并和变量插值后的最终属性集合,包含父POM中所有定义的属性
  • 可根据实际需求添加私有远程仓库,确保父项目能被正确拉取

备选方案:单独解析父POM模型

如果仅需要获取父POM的属性,无需完整子项目模型,可以通过子POM中声明的父坐标单独解析父POM:

import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.model.building.DefaultModelBuilder;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.resolution.internal.DefaultModelResolver;

import java.io.FileReader;
import java.io.File;
import java.util.Collections;

public class ParentPomReader {
    public static void main(String[] args) throws Exception {
        // 1. 读取子POM获取父坐标
        MavenXpp3Reader reader = new MavenXpp3Reader();
        Model childModel = reader.read(new FileReader("/path/to/subproject/pom.xml"));
        String parentGroupId = childModel.getParent().getGroupId();
        String parentArtifactId = childModel.getParent().getArtifactId();
        String parentVersion = childModel.getParent().getVersion();

        // 2. 配置仓库会话与解析器(同核心方案)
        var session = MavenRepositorySystemUtils.newSession();
        var central = new RemoteRepository.Builder("central", "default", "https://repo1.maven.org/maven2/").build();
        var resolver = new DefaultModelResolver(session, null, null, Collections.singletonList(central), null, null);

        // 3. 构建父POM模型
        DefaultModelBuilder modelBuilder = new DefaultModelBuilder();
        var request = new DefaultModelBuildingRequest()
                .setModelResolver(resolver)
                .setGroupId(parentGroupId)
                .setArtifactId(parentArtifactId)
                .setVersion(parentVersion);

        Model parentModel = modelBuilder.build(request).getEffectiveModel();
        String jasperVersion = parentModel.getProperties().getProperty("jasperreports.version");
        System.out.println("Parent jasperreports.version: " + jasperVersion);
    }
}

注意事项

  • 若使用私有仓库,需额外配置仓库认证信息
  • 选用与目标Maven项目兼容的Maven核心版本,避免版本冲突
  • 无需修改目标子POM的任何内容,完全基于Maven原生API实现属性获取

内容的提问来源于stack exchange,提问作者LemongrabThree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:35:07