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

2022-08-31 05:03:44

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


答案 1

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

  1. 在(最常见的)目录中创建一个文件(但在步骤4中,您可以告诉它查找其他位置)。.propertiessrc/main/resources

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

    foo.bar=${project.version}
    
  3. 在 Java 代码中,将属性文件中的值作为资源从类路径加载(google 提供了有关如何执行此操作的大量示例,但这里有一个初学者示例)。

  4. 在 Maven 中,启用资源筛选。这将导致 Maven 将该文件复制到输出类中,并在该复制期间转换资源,从而解释属性。你可以在这里找到一些信息,但你主要只是在你的pom中这样做:

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

您还可以访问其他标准属性,例如 , ,甚至是您放入 pom 中的任意属性等。资源筛选与 Maven 配置文件相结合,可以在生成时提供可变的生成行为。在运行时使用 指定配置文件时,可以启用属性,然后这些属性可以显示在生成中。project.nameproject.description<properties>-PmyProfile


答案 2

接受的答案可能是静态获取版本号到应用程序中的最佳和最稳定的方法,但实际上并没有回答原始问题:如何从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());
  }
}

推荐