在代码中从 maven pom.xml 中检索版本

新手上路,请多包涵

从代码中的 Maven 的 pom.xml 检索版本号的最简单方法是什么,即以编程方式?

原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 852
2 个回答

假设您使用的是 Java,您可以:

  1. 在(最常见的)您的 src/main/resources 目录中创建一个 .properties 文件(但在第 4 步中,您可以告诉它到别处查找)。

  2. 使用项目版本的标准 Maven 属性在你的 .properties 文件中设置一些属性的值:

    foo.bar=${project.version}

  1. 在您的 Java 代码中,将属性文件中的值作为类路径中的资源加载(谷歌提供了大量有关如何执行此操作的示例,但 这里是初学者的示例)。

  2. 在 Maven 中,启用资源过滤。这将导致 Maven 将该文件复制到您的输出类中,并在该复制过程中翻译资源,解释属性。你可以 在这里 找到一些信息,但你大多只是在你的 pom 中这样做:

    <build>
     <resources>
       <resource>
         <directory>src/main/resources</directory>
         <filtering>true</filtering>
       </resource>
     </resources>
   </build>

您还可以获得其他标准属性,例如 project.nameproject.description ,甚至是您放入 pom 中的任意属性 <properties> 与 Maven 资源过滤、组合等配置文件,可以在构建时为您提供可变的构建行为。当您在运行时使用 -PmyProfile 指定配置文件时,可以启用随后可以在您的构建中显示的属性。

原文由 Alex Miller 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题