如何手动创建MavenProject以获取内置属性

时间:2014-02-01 21:14:46

标签: java maven pom.xml

我知道这是一个相当奇怪的请求,所以我期待一大堆问题要详细说明。

注意:我是从“主”或“测试”执行此操作,而不是在Maven插件的上下文中执行此操作。

简而言之,我想要一个众所周知的pom.xml和本地/远程存储库并解析所有项目的属性。不仅是pom中的属性及其所有父pom,还有内置属性,例如$ {project.build.target}和$ {project.version},当我使用以下代码时,这些属性不可用:

private Properties loadMavenProperties(Properties originalProperties)
{
    final File pomFile = new File("pom.xml");
    final MavenProject mavenProject = loadProject(pomFile);
    if (mavenProject != null)
    {
        final Properties mavenProperties = loadMavenProperties(mavenProject);
        if (mavenProperties != null)
        {
            originalProperties.putAll(mavenProperties);
        }
    }

    return originalProperties;
}

private Properties loadMavenProperties(MavenProject mavenProject) throws IOException, XmlPullParserException
{
    if (mavenProject.getModel().getParent() == null)
    {
        return mavenProject.getProperties();
    }

    mavenProject.setRemoteArtifactRepositories(Arrays.asList(new ArtifactRepository[0]));

    final String userHome = System.getProperty("user.home");
    final String localRepoPath = "/.m2/repository";
    final File localRepo = new File(userHome, localRepoPath);

    final Aether aether = new Aether(mavenProject, localRepo);

    final Parent parent = mavenProject.getModel().getParent();
    try
    {
        final Artifact parentArtifact = aether.resolve(new DefaultArtifact(parent.toString()), "runtime").get(0);

        final Properties parentProperties = loadMavenProperties(loadProject(parentArtifact.getFile()));
        if (parentProperties != null)
        {
            parentProperties.putAll(mavenProject.getProperties());
        }

        return parentProperties;
    }
    catch (DependencyResolutionException e)
    {
        throw new DowngradedException(e);
    }
}

private MavenProject loadProject(File pomFile) throws IOException, XmlPullParserException
{
    if (pomFile != null && pomFile.exists())
    {
        FileReader reader = null;

        try
        {
            final MavenXpp3Reader mavenReader = new MavenXpp3Reader();
            reader = new FileReader(pomFile);
            Model model = mavenReader.read(reader);
            model.setPomFile(pomFile);

            return new MavenProject(model);
        }
        finally
        {
            reader.close();
        }
    }

    return null;
}

适用于所有显式定义的属性但不包含任何内置属性。

这是一个失败的原因吗?

感谢您的任何见解。

1 个答案:

答案 0 :(得分:0)

版本和构建目录之类的东西不会作为属性公开,而是来自MavenProject类本身。请参阅JavaDocs

在您的具体示例中,您将通过调用getVersion()来获取版本,并通过调用getBuild()来构建目录信息,该Build将返回包含其中各种目录的{{1}}对象。