Java 在Eclipse中运行时从pom获取maven项目版本和工件ID
当我遇到这个问题时,我正在查找如何从maven pom或manifest获取应用程序名称(工件id)和版本 当我打包项目时,上述方法对我有效,但当我尝试使用eclipse运行程序时,似乎无法使任何东西起作用。我尝试在构建时使用.properties方法,因为我假设它不依赖于包,但仍然没有得到结果。如果有人对这个问题有想法或解决办法,我们将不胜感激 我最后一次尝试如下。这将在打包时使用清单(可以工作),并在eclipse中运行时尝试获取.properties文件Java 在Eclipse中运行时从pom获取maven项目版本和工件ID,java,maven-3,pom.xml,Java,Maven 3,Pom.xml,当我遇到这个问题时,我正在查找如何从maven pom或manifest获取应用程序名称(工件id)和版本 当我打包项目时,上述方法对我有效,但当我尝试使用eclipse运行程序时,似乎无法使任何东西起作用。我尝试在构建时使用.properties方法,因为我假设它不依赖于包,但仍然没有得到结果。如果有人对这个问题有想法或解决办法,我们将不胜感激 我最后一次尝试如下。这将在打包时使用清单(可以工作),并在eclipse中运行时尝试获取.properties文件 String appVersion
String appVersion = getClass().getPackage().getImplementationVersion();
if(appVersion == null || "".equals(appVersion)) {
appVersion = Glob.getString(appVersion);
if(appVersion == null || "".equals(appVersion)) {
System.exit(0);
}
}
创建属性文件
src/main/resources/project.properties
内容如下
version=${project.version}
artifactId=${project.artifactId}
现在打开
有一些类似的内容
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"));
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插件”,表示您希望添加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>
...
${project.artifactId}
...
maven战争插件
3.2.2
假的
真的
...
然后从代码中的某个位置调用
VersionUtil.getApplicationVersion()
。访问pom.xml
作为。。。嗯<代码>XML不是一个选项吗?“计划”的意图是什么?程序实现为Maven插件是一个选项吗?所以我的问题是,我的属性变量与我的局部变量同名,我忘了用引号括起属性变量调用。我确实按照你的步骤做了,但它不起作用。你能看看我的问题吗?我需要使用properties.load(this.getClass().getClassLoader().getResourceAsStream(“project.properties”)代码>以使其工作HI!它工作得很好,但是,在资源目录中,我有其他“.properties”文件,这些文件现在有编码问题。你知道有没有办法在maven中设置标记的编码吗?嗨,我正在使用你的代码,但我认为我们不需要在pom.xml中添加一些东西。我只使用Properties类,它工作得很好,没有对我的pom.xml设置任何内容。如果您从公共静态void main()尝试它,“this”将不能作为静态方法使用。因此,您需要将它与包含公共静态void main()的类名一起使用,如下所示:properties.load(.class.getResourceAsStream(“project.properties”)代码>不幸的是,当代码从类(即Intellij中的测试)运行时,此解决方案不起作用:这是此方法的一个限制。
package my.domain.package;
public class VersionUtil {
public static String getApplicationVersion(){
String version = VersionUtil.class.getPackage().getImplementationVersion();
return (version == null)? "unable to reach": version;
}
}
<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>
...