在 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里有没有办法在标签上设置编码? 如果您从 public static void main() 中尝试它,“this”将不能作为它的静态方法使用。因此,您需要将它与包含 public static void main() 的类名一起使用,如下所示:properties.load(&lt;Main Class Name&gt;.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") 获取值?

应用程序在模拟器中运行时卡在启动画面上

在android [duplicate]中运行时检查权限时获取NullPointerException

下面一个java程序在eclipse中运行时出现了main主函数错误?我发现很多程序都是这种错误,大侠们帮帮忙吧…