Каков самый простой способ получить номер версии из maven pom.xml в коде, т.е. программно?
Извлечь версию из maven pom.xml в код
Ответ 1
Предполагая, что вы используете Java, вы можете
-
Создайте
.properties
файл в (наиболее часто) вашем каталогеsrc/main/resources
(но на шаге 4 вы можете сказать, что он должен искать в другом месте). -
Задайте значение некоторого свойства в вашем файле
.properties
, используя стандартное свойство Maven для версии проекта:foo.bar=${project.version}
-
В вашем Java-коде загрузите значение из файла свойств в качестве ресурса из пути к классам (google для подробных примеров того, как это сделать, но здесь пример для стартеры).
-
В 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
, это может включить свойства, которые затем могут отображаться в вашей сборке.
Ответ 2
Принятый ответ может быть лучшим и наиболее стабильным способом получить номер версии в приложении статически, но на самом деле не отвечает на исходный вопрос: как получить номер версии артефакта из 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());
}
}
Ответ 3
Упакованные артефакты содержат файл 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). Если это проблема для вас, то подход, описанный Алексом, - это путь.
Ответ 4
Существует также метод, описанный в Простой способ отображения номера версии ваших приложений с помощью 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()
Я нашел этот метод более простым.
Ответ 5
В дополнение к тому, что опубликовал @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 @[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]@
Ответ 6
Если вы используете mvn-упаковку, такую как jar или war, используйте:
getClass().getPackage().getImplementationVersion()
Он считывает в архиве свойство "Реализация-версия" сгенерированного файла META-INF/MANIFEST.MF(который установлен в версию pom.xml).
Ответ 7
Используйте эту библиотеку для простоты простого решения. Добавьте в манифест все, что вам нужно, а затем выполните запрос по строке.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Ответ 8
В проектах spring -boot вы можете сделать это следующим образом:
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();
infoMap содержит карту с информацией о сборке, включая версию из POM.
Я нашел его в классе EndpointAutoConfiguration проекта spring -boot.
Ответ 9
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Получить версию, используя this.getClass().getPackage().getImplementationVersion()
PS Не забудьте добавить:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
Ответ 10
Иногда достаточно командной строки Maven, например, при написании сценариев, связанных с версией проекта, например, поиск артефактов из хранилища:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Пример использования:
VERSION=$( mvn help:evaluate -Dexpression=project.version -q -DforceStdout )
ARTIFACT_ID=$( mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout )
GROUP_ID_URL=$( mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout | sed -e 's#\.#/#g' )
curl -f -S -O http://REPO-URL/mvn-repos/${GROUP_ID_URL}/${ARTIFACT_ID}/${VERSION}/${ARTIFACT_ID}-${VERSION}.jar