Каков самый простой способ получить номер версии из pom.xml maven в коде, то есть программно?Извлечь версию из maven pom.xml в коде
ответ
Предполагая, что вы используете Java, вы можете
Создать
.properties
файл (наиболее часто) вашейsrc/main/resources
директории (но на шаге 4 вы можете сказать ему, чтобы искать в другом месте).Установите значение некоторого свойства в файле
.properties
, используя стандартный Maven свойство для версии проекта:foo.bar=${project.version}
В коде Java, загрузить значение из файла свойств в качестве ресурса из пути к классам (Google для обильных примеров того, как это сделать, но here's an example for starters).
В Maven включите фильтрацию ресурсов - это заставит Maven скопировать этот файл в ваши классы вывода и перевести ресурс во время этой копии, интерпретируя свойство. Вы можете найти некоторую информацию here но в основном просто сделать это в вашем ПОМ:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
Вы также можете получить другие стандартные свойства, такие как project.name
, project.description
или даже произвольных свойств вы положили в вашем ПОМ <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
Многие приложения используют этот файл для чтения версию приложения/банку во время выполнения, есть установка нуля требуется.
Единственная проблема с вышеприведенным подходом заключается в том, что этот файл (в настоящее время) создан во время фазы package
и, таким образом, не будет присутствовать во время тестов и т. Д. (Есть проблема с Jira, чтобы изменить это, см. MJAR-76). Если это проблема для вас, то подход, описанный Алексом, - это путь.
для людей, которые ищут пример, читающий свойства, этот пост содержит несколько методов - http://www.javablog.fr/javaspring-get-and-display-the-version-from-manifest-mf.html – chrismarx
Существует также метод, описанный в 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()
Я нашел этот способ проще.
-1 - Это решение не сработало для меня; значение 'getImplementationVersion()' было 'null'. (версия maven 3.0.4) –
в зависимости от фазы ...работает только тогда, когда артефакт упаковывается, поэтому не работает на модульные тесты: -/ – wikier
Для артефактов '.war', не забудьте использовать' maven-war-plugin' вместо 'maven-jar-plugin' –
Используйте эту библиотеку для удобства простого решения. Добавьте в манифест, что вам нужно, а затем запросите строку.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Если вы используете МВН упаковки, такие как баночке или войны, использование:
getClass().getPackage().getImplementationVersion()
Она читает свойство "от реализации версии" сгенерированного META-INF/MANIFEST. MF (который установлен в версию pom.xml) в архиве.
В пружинно-загрузочные проектов, которые вы можете сделать это следующим образом:
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 проекта весенней загрузки.
Что-то не получается об этом ответе, потому что таким образом infoMap пуст. Подобный фрагмент кода не найден в месте ссылки. – Dennis
В дополнение, что @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]@
Это именно то, что я искал, спасибо! – burcakulug
Принятый ответ может быть лучшим и наиболее стабильным способом, чтобы получить номер версии в приложение статически, но на самом деле не отвечает на исходный вопрос: как получить номер версии артефакта из 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());
}
}
Спасибо, именно то, что я искал. – Kefirchiks
Это отличный и простой способ сделать это, спасибо! –
Именно то, что я искал. Спасибо тебе, друг. –
Я нашел код [this] (http://stackoverflow.com/questions/2712970/get-maven-artifact-version-at-runtime), который не изменяет конфигурацию Maven. – Wendel