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

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

假设你正在使用Java,你可以

  1. 在(最常见的) src/main/resources目录下创build一个.properties文件(但是在步骤4你可以告诉它在其他地方)。

  2. 使用项目版本的标准Maven属性在.properties文件中设置一些属性的值: foo.bar=${project.version}

  3. 在你的Java代码中,从属性文件中加载值作为类path中的一个资源(谷歌为如何做到这一点的丰富的例子,但这里是一个初学者的例子 )。

  4. 在Maven中,启用资源过滤 – 这将导致Maven将该文件复制到输出类中,并在该复制期间翻译资源,解释该属性。 你可以在这里find一些信息,但你主要是在你的POM中做这个:

     <build立>
       <资源>
         <资源>
           <目录>的src /主/资源</目录>
           <滤波>真</过滤>
         </资源>
       </资源>   
     </build造>

你也可以得到其他的标准属性,比如project.nameproject.description ,甚至是你放在你的pom <properties>任意属性等。资源过滤与Mavenconfiguration文件结合,可以在构build时为你提供可变的构build行为。 在运行时用-PmyProfile指定configuration文件时,可以启用可以在构build中显示的属性。

打包的工件包含一个META-INF/maven/${groupId}/${artifactId}/pom.properties文件,其内容如下所示:

 #Generated by Maven #Sun Feb 21 23:38:24 GMT 2010 version=2.5 groupId=commons-lang artifactId=commons-lang 

许多应用程序使用此文件在运行时读取应用程序/ jar版本,所需的设置为零。

上述方法唯一的问题是,这个文件是(在package阶段(当前)生成的,因此在testing期间不会出现(有一个Jira的问题来改变这个,参见MJAR-76 )。 如果这对你来说是一个问题,那么Alex所描述的方法就是要走的路。

还有简单的方法来描述使用Maven显示您的应用程序版本号的方法 :

将此添加到pom.xml

 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>test.App</mainClass> <addDefaultImplementationEntries> true </addDefaultImplementationEntries> </manifest> </archive> </configuration> </plugin> </plugins> </build> 

然后使用这个:

 App.class.getPackage().getImplementationVersion() 

我发现这个方法比较简单。

被接受的答案可能是最好也是最稳定的方式来静态获取版本号到一个应用程序,但实际上并没有回答原来的问题:如何从pom.xml中检索神器的版本号? 因此,我想提供一个替代方法来展示如何在运行时dynamic地执行它:

你可以使用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()); } } 

为了补充@kieste发布的内容,如果您使用的是Spring-boot,我认为这是让Maven在您的代码中提供信息的最佳方式: http ://docs.spring.io/spring-boot/上的文档docs / current / reference / htmlsingle /#production-ready-application-info是非常有用的。

您只需激活执行器,然后在您的application.propertiesapplication.yml添加所需的属性

 Automatic property expansion using Maven You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven 'project properties' via @..@ placeholders, eg project.artifactId=myproject project.name=Demo project.version=XXXX project.description=Demo project for info endpoint info.build.artifact=@project.artifactId@ info.build.name=@project.name@ info.build.description=@project.description@ info.build.version=@project.version@ 

如果你使用mvn包装如jar或war,请使用:

 getClass().getPackage().getImplementationVersion() 

它读取存档中生成的META-INF / MANIFEST.MF(设置为pom.xml的版本)的属性“Implementation-Version”。

使用这个库来简化一个简单的解决scheme。 添加到清单,你需要什么,然后通过string查询。

  System.out.println("JAR was created by " + Manifests.read("Created-By")); 

http://manifests.jcabi.com/index.html

spring-boot项目中,你可以这样做:

 PropertiesConfigurationFactory<Map<String, Object>> factory = new PropertiesConfigurationFactory<Map<String, Object>>( new LinkedHashMap<String, Object>()); factory.setTargetName("info"); factory.setPropertySources(environment.getPropertySources()); Map<String, Object> infoMap = factory.getObject(); 

infoMap包含一个包含构build信息的地图,包括来自POM的版本。

我在spring-boot项目的EndpointAutoConfiguration类中find它。

@see https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java