访问pom中定义的Maven属性


80

如何访问普通Maven项目和Maven插件项目中Pom中定义的Maven属性?


1
您对哪种信息感兴趣?如果只是版本或类似内容,则最好将其放入清单中并从那里读取
约阿希姆·绍尔

1
Stack Overflow上有很多关于此的文章:stackoverflow.com/search?q= read+pom+in+java ,至少,在发布之前先看看。因此,编辑助手应该向他们展示。谷歌也。
让·雷米Revy

谢谢你们。我现在意识到这确实是不好的做法。会尝试其他方法。
SparedWhisle 2012年

Answers:


76

使用properties-maven-pluginproperties在编译时将特定的pom写入文件,然后在运行时读取该文件。

在您的pom.xml中

<properties>
     <name>${project.name}</name>
     <version>${project.version}</version>
     <foo>bar</foo>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.outputDirectory}/my.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

然后在.java中

java.io.InputStream is = this.getClass().getResourceAsStream("my.properties");
java.util.Properties p = new Properties();
p.load(is);
String name = p.getProperty("name");
String version = p.getProperty("version");
String foo = p.getProperty("foo");

那行得通,但是使Eclipse陷入了无限的构建/部署到Tomcat循环(构建->生成my.properties->资源已更改->构建),所以我不得不将阶段更改为compile。虽然不确定这是否是正确的解决方案。
Nikita Bosik '16

@atoregozh建议使用Guava Resource来加载属性文件。好。但是撤消了更改,以使此示例在使用标准API的情况下保持最小。
Leif Gruenwoldt

2
一个稳定的1.0.0版本现已发布
Pieter De Bie

25

从Maven设置系统变量,并在Java中使用以下调用

System.getProperty("Key");

7
仅当您正在使用Maven-exec-plugin从Maven运行生成的版本时,这才起作用。如果仅使用Maven编译代码,则将无法正常工作。
大卫·帕什利

@DavidPashley,没错。在仅编译的情况下,我猜需要从编译器插件中设置变量。
桑托什


5

Maven已经有一种解决方案可以满足您的需求:

从POM.xml-pom解析器获取MavenProject?

顺便说一句:第一次点击谷歌搜索;)

Model model = null;
FileReader reader = null;
MavenXpp3Reader mavenreader = new MavenXpp3Reader();

try {
     reader = new FileReader(pomfile); // <-- pomfile is your pom.xml
     model = mavenreader.read(reader);
     model.setPomFile(pomfile);
}catch(Exception ex){
     // do something better here
     ex.printStackTrace()
}

MavenProject project = new MavenProject(model);
project.getProperties() // <-- thats what you need

1
这里不鼓励单链接答案(主要是因为链接的资源消失后,它们可能变得无用)。您至少应总结链接中的信息以在此处发布。
约阿希姆·绍尔

2
这真的是一个非常糟糕的做法,只需使用Maven资源插件即可!
马克·巴克

1
如果他要从Java代码访问属性,为什么这应该是不好的做法?
SWoeste

1
但前提是您假设他想/可以更改自己的pom。我同意您的看法,直接在pom文件而不是外部文件中拥有属性可能是不好的。可以使用java属性类读取该文件-当然。但是在其他情况下呢?然后,maven模型是解决问题的最佳解决方案……但是在戴维(David Dai)不告诉我们他到底想做什么之前,我们所有人都只是在猜测。
SWoeste

1
我的理解也是,我们有一个mvn pom文件(包含属性)和一个java应用程序(我们要从中读取该pom文件的详细信息)。无需实际运行Maven。
Andreas Dolk

-3

您可以使用JDOM(http://www.jdom.org/)解析pom文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.