Получить версию из maven pom.xml в коде



каков самый простой способ получить номер версии из pom maven.xml в коде, т. е. программно?

884   7  

7 ответов:

предполагая, что вы используете Java, вы можете

  1. создать в (чаще всего) ваш src/main/resources каталог (но в шаге 4 Вы могли бы сказать ему, чтобы искать в другом месте).

  2. установите значение некоторого свойства в вашем .properties файл с использованием стандартного свойства Maven для версии проекта:foo.bar=${project.version}

  3. в коде Java загрузите значение из файла свойств в качестве ресурса из пути к классам (google for обильные примеры того, как это сделать, но вот пример для затравки).

  4. в Maven включите фильтрацию ресурсов - это приведет к тому, что Maven скопирует этот файл в ваши выходные классы и переведет ресурс во время этой копии, интерпретируя свойство. Вы можете найти некоторую информацию здесь но вы в основном просто делаете это в своем pom:

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

вы также можете перейти к другим стандартным свойствам, таким как project.name, project.description, или даже произвольные свойства, которые вы помещаете в свой pom <properties> и т. д. Фильтрация ресурсов в сочетании с профилями Maven может дать вам переменное поведение сборки во время сборки. При указании профиля во время выполнения с помощью -PmyProfile, что может включить свойства, которые затем могут отображаться в вашей сборке.

упакованные артефакты содержат META-INF/maven/${groupId}/${artifactId}/pom.properties файл, содержимое которого выглядит следующим образом:

#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang

многие приложения используют этот файл для чтения версии приложения / jar во время выполнения, требуется нулевая настройка.

единственная проблема с вышеуказанным подходом заключается в том, что этот файл (в настоящее время) генерируется во время package фаза и, таким образом, не будет присутствовать во время тестов и т. д. (Есть проблема Jira, чтобы изменить это, см. MJAR-76). Если это проблема для вас, то подход, описанный Алексом, - это путь.

принятый ответ может быть лучшим и наиболее стабильным способом получить номер версии в приложении статически, но фактически не отвечает на исходный вопрос: Как получить номер версии артефакта из pom.xml? Таким образом, я хочу предложить альтернативу, показывая, как это делать динамически во время выполнения:

вы можете использовать сам Maven. Чтобы быть более точным, Вы можете использовать Maven библиотека.

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-model</artifactId>
  <version>3.3.9</version>
</dependency>

а затем сделать что-то вроде этого в Java:

package de.scrum_master.app;

import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;

import java.io.FileReader;
import java.io.IOException;

public class Application {
    public static void main(String[] args) throws IOException, XmlPullParserException {
        MavenXpp3Reader reader = new MavenXpp3Reader();
        Model model = reader.read(new FileReader("pom.xml"));
        System.out.println(model.getId());
        System.out.println(model.getGroupId());
        System.out.println(model.getArtifactId());
        System.out.println(model.getVersion());
    }
}

лог консоли выглядит следующим образом:

de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT

обновление 2017-10-31: чтобы ответить на следующий вопрос Саймона Собиша, я изменил пример следующим образом:

package de.scrum_master.app;

import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Application {
  public static void main(String[] args) throws IOException, XmlPullParserException {
    MavenXpp3Reader reader = new MavenXpp3Reader();
    Model model;
    if ((new File("pom.xml")).exists())
      model = reader.read(new FileReader("pom.xml"));
    else
      model = reader.read(
        new InputStreamReader(
          Application.class.getResourceAsStream(
            "/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
          )
        )
      );
    System.out.println(model.getId());
    System.out.println(model.getGroupId());
    System.out.println(model.getArtifactId());
    System.out.println(model.getVersion());
  }
}

существует также метод, описанный в простой способ отображения номера версии приложения с помощью Maven:

добавьте это в pom.xml

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>test.App</mainClass>
            <addDefaultImplementationEntries>
              true
            </addDefaultImplementationEntries>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

тогда используйте это:

App.class.getPackage().getImplementationVersion()

Я нашел этот метод, чтобы быть проще.

чтобы дополнить то, что @kieste опубликовал, что я думаю, это лучший способ получить информацию о сборке Maven, доступную в вашем коде, если вы используете Spring-boot: документация по адресу http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-application-info очень полезно.

вам просто нужно активировать приводы и добавить необходимые свойства в свой application.properties или application.yml

Automatic property expansion using Maven

You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven ‘project properties’ via @..@ placeholders, e.g.

project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
[email protected]@
[email protected]@
[email protected]@
[email protected]@

Если вы используете упаковку mvn, такую как jar или war, используйте:

getClass().getPackage().getImplementationVersion()

он считывает свойство "реализация-версия" сгенерированного META-INF/манифеста.MF (который установлен в pom.версия xml) в архиве.

используйте эту библиотеку для простоты простого решения. Добавьте в манифест все, что вам нужно, а затем запрос по строке.

 System.out.println("JAR was created by " + Manifests.read("Created-By"));

http://manifests.jcabi.com/index.html

Comments

    Ничего не найдено.