Java 在Eclipse中运行时从pom获取maven项目版本和工件ID

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

当我遇到这个问题时,我正在查找如何从maven pom或manifest获取应用程序名称(工件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);
        }
    }
创建属性文件

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>
    ...