Getting maven project version and artifact ID from pom while running in Eclipse
Asked Answered
A

2

42

I was looking up how to get the application name(artifact id) and version from maven pom or manifest when I came across this question Get Maven artifact version at runtime.

The above works for me when I package the project but I can't seem to get anything to work when I try to run the program using eclipse. I tried using the .properties method when building since I assumed that is not package dependent but I am still not getting a result. If anyone has an idea or solution to this problem it would be greatly appreciated.

My last attempt is below. This uses the manifest when packaged(which works) and trying to get the .properties file when running in eclipse.

String appVersion = getClass().getPackage().getImplementationVersion();
    if(appVersion == null || "".equals(appVersion)) {
        appVersion = Glob.getString(appVersion);
        if(appVersion == null || "".equals(appVersion)) {
            System.exit(0);
        }
    }
Astrea answered 24/10, 2014 at 15:43 Comment(2)
Accessing the pom.xml as ... well ... XML is not an option? What is "the program"'s intention? Is the program implemented as Maven plugin an option?Anticipative
so my problem was that my property variable was the same name as my local variable and I forgot to enclose the property variable call in quotes.Astrea
V
106

Create a property file

src/main/resources/project.properties

with the below content

version=${project.version}
artifactId=${project.artifactId}

Now turn on maven resource filtering

  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>

so that this file is processed into

target/classes/project.properties

with some content similar to this

version=1.5
artifactId=my-artifact

Now you can read this property file to get what you want and this should work every time.

final Properties properties = new Properties();
properties.load(this.getClassLoader().getResourceAsStream("project.properties"));
System.out.println(properties.getProperty("version"));
System.out.println(properties.getProperty("artifactId"));
Virgilvirgilia answered 26/10, 2014 at 14:12 Comment(7)
I did follow your steps but it doesn't work. Could you please have a look at my question #37490662Agaric
I needed to use properties.load(this.getClass(). getClassLoader().getResourceAsStream("project.properties")); in order for it to workChader
Hi! It worked just fine, but, in the resources dir I have others ".properties" files and those are now having encoding problem. Do you know if there is a way to set encoding on the <resource> tag in maven?Wolver
Hi, i am using your code, but i don't think we need to add something to pom.xml. I only using Properties Class and it is worked just fine, without setting anything to my pom.xmlKahl
If you are trying it from the public static void main(), "this" wont be available as its a static method. So you need to use it with the class name containing the public static void main() , like this: properties.load(<Main Class Name>.class.getResourceAsStream("project.properties"));Whitmer
For doing this in a static method, @DilipMuthukurussimana 's didn't work for me. You need <ClassName>.class.getClassLoader().getResourceAsStream("project.properties")Lafreniere
For spring boot applications, consider that default placeholders have been re-configured: use @ - so @project.version@ instead of ${project.version}. See https://mcmap.net/q/102363/-get-maven-properties-at-build-timeRafi
U
2

An easy solution with maven 4 is now to add a VersionUtil static method in your package:

package my.domain.package;
public class VersionUtil {
  public static String getApplicationVersion(){
    String version = VersionUtil.class.getPackage().getImplementationVersion();
    return (version == null)? "unable to reach": version;
  }
}

The thing is you need this ´mave-war-plugin´ in the project's pom, saying you want to add 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>
    ...

Then call the VersionUtil.getApplicationVersion() from some place in your code.

Unbeliever answered 14/11, 2019 at 12:27 Comment(1)
Unfortunatelly this solution doesn't work when code is running from classes(ie from tests in Intellij) : this is one limitation of this approach.Vivianaviviane

© 2022 - 2024 — McMap. All rights reserved.