在 Eclipse 中运行时从 pom 获取 maven 项目版本和工件 ID
Posted
技术标签:
【中文标题】在 Eclipse 中运行时从 pom 获取 maven 项目版本和工件 ID【英文标题】:Getting maven project version and artifact ID from pom while running in Eclipse 【发布时间】:2014-12-20 11:59:07 【问题描述】:当我遇到这个问题 Get Maven artifact version at runtime 时,我正在查找如何从 maven pom 或清单中获取应用程序名称(工件 ID)和版本。
当我打包项目时,以上内容对我有用,但当我尝试使用 eclipse 运行程序时,我似乎无法得到任何工作。我在构建时尝试使用 .properties 方法,因为我认为它不依赖于包,但我仍然没有得到结果。如果有人对此问题有任何想法或解决方案,将不胜感激。
我的最后一次尝试如下。这在打包时使用清单(有效)并在 Eclipse 中运行时尝试获取 .properties 文件。
String appVersion = getClass().getPackage().getImplementationVersion();
if(appVersion == null || "".equals(appVersion))
appVersion = Glob.getString(appVersion);
if(appVersion == null || "".equals(appVersion))
System.exit(0);
【问题讨论】:
访问pom.xml
...以及...XML
不是一个选项? “程序”的意图是什么? 程序是作为 Maven 插件实现的选项吗?
所以我的问题是我的属性变量与我的局部变量同名,我忘记将属性变量调用用引号引起来。
【参考方案1】:
创建属性文件
src/main/resources/project.properties
以下内容
version=$project.version
artifactId=$project.artifactId
现在开启maven resource filtering
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
让这个文件被处理成
target/classes/project.properties
有一些类似的内容
version=1.5
artifactId=my-artifact
现在你可以阅读这个属性文件来得到你想要的,这应该每次都能工作。
final Properties properties = new Properties();
properties.load(this.getClassLoader().getResourceAsStream("project.properties"));
System.out.println(properties.getProperty("version"));
System.out.println(properties.getProperty("artifactId"));
【讨论】:
我确实按照您的步骤操作,但它不起作用。你能看看我的问题***.com/questions/37490162/… 我需要使用properties.load(this.getClass(). getClassLoader().getResourceAsStream("project.properties"));
才能让它工作
嗨!它工作得很好,但是,在资源目录中,我还有其他“.properties”文件,这些文件现在有编码问题。你知道maven里有没有办法在properties.load(<Main Class Name>.class.getResourceAsStream("project.properties"));
对于 Spring Boot 应用程序,考虑默认占位符已被重新配置:使用 @ - 所以 @project.version@ 而不是 $project.version。见***.com/a/37491454/3957413【参考方案2】:
现在使用 maven 4 的一个简单解决方案是在您的包中添加一个 VersionUtil
静态方法:
package my.domain.package;
public class VersionUtil
public static String getApplicationVersion()
String version = VersionUtil.class.getPackage().getImplementationVersion();
return (version == null)? "unable to reach": version;
问题是你在项目的 pom 中需要这个“mave-war-plugin”,说你想添加addDefaultImplementationEntries
:
<build>
<finalName>$project.artifactId</finalName>
<plugins>
...
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
...
然后从代码中的某个位置调用VersionUtil.getApplicationVersion()
。
【讨论】:
不幸的是,当代码从类(即 Intellij 中的测试)运行时,此解决方案不起作用:这是此方法的一个限制。以上是关于在 Eclipse 中运行时从 pom 获取 maven 项目版本和工件 ID的主要内容,如果未能解决你的问题,请参考以下文章
eclipse vs tomcat部署-项目在eclipse中运行时导出的战争(部分)失败
当应用程序在 IIS 中运行时,如何从 Request.ServerVariables("LOGON_USER") 获取值?