从代码中的 Maven 的 pom.xml 检索版本号的最简单方法是什么,即以编程方式?
原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议
公认的答案可能是 静态 获取应用程序版本号的最佳和最稳定的方法,但实际上并没有回答原始问题:如何从 pom.xml 中检索工件的版本号?因此,我想提供一种替代方法来展示如何在运行时 动态地 执行此操作:
您可以使用 Maven 本身。更准确地说,您可以使用 Maven 库。
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
然后在 Java 中做这样的事情:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.FileReader;
import java.io.IOException;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader("pom.xml"));
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
控制台日志如下:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
2017-10-31 更新: 为了回答 Simon Sobisch 的后续问题,我将示例修改为:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model;
if ((new File("pom.xml")).exists())
model = reader.read(new FileReader("pom.xml"));
else
model = reader.read(
new InputStreamReader(
Application.class.getResourceAsStream(
"/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
)
)
);
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
原文由 kriegaex 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
假设您使用的是 Java,您可以:
在(最常见的)您的
src/main/resources
目录中创建一个.properties
文件(但在第 4 步中,您可以告诉它到别处查找)。使用项目版本的标准 Maven 属性在你的
.properties
文件中设置一些属性的值:在您的 Java 代码中,将属性文件中的值作为类路径中的资源加载(谷歌提供了大量有关如何执行此操作的示例,但 这里是初学者的示例)。
在 Maven 中,启用资源过滤。这将导致 Maven 将该文件复制到您的输出类中,并在该复制过程中翻译资源,解释属性。你可以 在这里 找到一些信息,但你大多只是在你的 pom 中这样做:
您还可以获得其他标准属性,例如
project.name
、project.description
,甚至是您放入 pom 中的任意属性<properties>
与 Maven 资源过滤、组合等配置文件,可以在构建时为您提供可变的构建行为。当您在运行时使用-PmyProfile
指定配置文件时,可以启用随后可以在您的构建中显示的属性。