2010-09-13 3 views

ответ

170

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

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

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

  3. В коде Java, загрузить значение из файла свойств в качестве ресурса из пути к классам (Google для обильных примеров того, как это сделать, но here's an example for starters).

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

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

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

+1

Я нашел код [this] (http://stackoverflow.com/questions/2712970/get-maven-artifact-version-at-runtime), который не изменяет конфигурацию Maven. – Wendel

59

Пакетированные артефакты содержат 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 

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

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

+7

для людей, которые ищут пример, читающий свойства, этот пост содержит несколько методов - http://www.javablog.fr/javaspring-get-and-display-the-version-from-manifest-mf.html – chrismarx

32

Существует также метод, описанный в Easy way to display your apps version number using 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() 

Я нашел этот способ проще.

+11

-1 - Это решение не сработало для меня; значение 'getImplementationVersion()' было 'null'. (версия maven 3.0.4) –

+7

в зависимости от фазы ...работает только тогда, когда артефакт упаковывается, поэтому не работает на модульные тесты: -/ – wikier

+0

Для артефактов '.war', не забудьте использовать' maven-war-plugin' вместо 'maven-jar-plugin' –

4

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

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

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

11

Если вы используете МВН упаковки, такие как баночке или войны, использование:

getClass().getPackage().getImplementationVersion() 

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

2

В пружинно-загрузочные проектов, которые вы можете сделать это следующим образом:

PropertiesConfigurationFactory<Map<String, Object>> factory = 
    new PropertiesConfigurationFactory<Map<String, Object>>(
     new LinkedHashMap<String, Object>()); 
factory.setTargetName("info"); 
factory.setPropertySources(environment.getPropertySources()); 
Map<String, Object> infoMap = factory.getObject(); 

Инфокарта содержит карту с информацией сборки, включая версии с ПОМ.

Я нашел его в классе EndpointAutoConfiguration проекта весенней загрузки.

@see https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java

+0

Что-то не получается об этом ответе, потому что таким образом infoMap пуст. Подобный фрагмент кода не найден в месте ссылки. – Dennis

10

В дополнение, что @kieste выложила, что я думаю, что это лучший способ, чтобы Maven построить информацию, доступную в вашем коде, если вы используете Spring-загрузку: документация на 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 @[email protected] 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]@ 
+0

Это именно то, что я искал, спасибо! – burcakulug

35

Принятый ответ может быть лучшим и наиболее стабильным способом, чтобы получить номер версии в приложение статически, но на самом деле не отвечает на исходный вопрос: как получить номер версии артефакта из 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 

Update 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()); 
    } 
} 
+0

Спасибо, именно то, что я искал. – Kefirchiks

+0

Это отличный и простой способ сделать это, спасибо! –

+0

Именно то, что я искал. Спасибо тебе, друг. –