Получить версию из maven pom.xml в коде
каков самый простой способ получить номер версии из pom maven.xml в коде, то есть программно?
7 ответов
предполагая, что вы используете Java, вы можете
создать в (чаще всего) ваш
src/main/resources
каталог (но на шаге 4 Вы можете сказать, чтобы он смотрел в другом месте).установите значение некоторого свойства в вашем
.properties
файл, использующий стандартное свойство Maven для версии проекта:foo.bar=${project.version}
в коде Java загрузите значение из файла свойств в качестве ресурса из пути к классам (google для обильные примеры того, как это сделать, но вот пример для затравки).
в Maven включите фильтрацию ресурсов - это заставит Maven скопировать этот файл в ваши выходные классы и перевести ресурс во время этой копии, интерпретируя свойство. Вы можете найти некоторую информацию здесь но вы в основном просто делаете это в своем пом:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
вы также можете перейти к другим стандартным свойствам, таким как project.name
, project.description
, или даже произвольные свойства, которые вы помещаете в свой pom <properties>
, etc. Фильтрация ресурсов в сочетании с профилями 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
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
Если вы используете упаковку mvn, такую как jar или war, используйте:
getClass().getPackage().getImplementationVersion()
он считывает свойство "реализация-версия" сгенерированного META-INF/MANIFEST.MF (который установлен в pom.версия xml) в архиве.
используйте эту библиотеку для простоты простого решения. Добавьте в манифест все, что вам нужно, а затем запросите по строке.
System.out.println("JAR was created by " + Manifests.read("Created-By"));