Apache Maven
Доступ к информации Maven в коде
Поиск…
Вступление
Иногда полезно использовать свойства maven, такие как текущая версия, в коде. Вот несколько способов сделать это.
Получение номера версии из банки
Если вы упаковываете приложение в jar
используя maven-jar-plugin
или maven-assembly-plugin
, простой способ получить текущую версию pom - добавить запись в манифест, которая затем доступна на Java.
Секрет заключается в том, чтобы установить флаг addDefaultImplementationEntries
в значение true (а addDefaultSpecificationEntries
вам также нужен идентификатор артефакта).
Конфигурация плагина jar :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>...</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
конфигурация подключаемого модуля :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution .../>
</executions>
</plugin>
addDefaultImplementationEntries
инструктирует Maven добавить следующие заголовки в MANIFEST.MF
вашей фляги:
Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test
Теперь вы можете использовать эту строку кода в любом месте вашей банки для доступа к номеру версии:
getClass().getPackage().getImplementationVersion()
Дополнительная информация здесь и здесь .
Сохранение файла свойств в синхронизации с использованием mecanism фильтрации maven
Как поясняется в этой документации ,
Иногда файл ресурсов должен содержать значение, которое может быть предоставлено только во время сборки. Чтобы выполнить это в Maven, поместите ссылку на свойство, которое будет содержать значение в вашем файле ресурсов, используя синтаксис
${<property name>}
. Свойство может быть одним из значений, определенных в вашемpom.xml
, значением, определенным вsettings.xml
pom.xml
пользователя, свойства, определенного во внешнем файле свойств, или системном свойстве.
В качестве примера давайте создадим простой info.txt
в src/main/resources
содержащий версию pom и время сборки.
создайте
src/main/resources/info.txt
со следующим содержимым:version = $ {pom.version} build.date = $ {timestamp}
попросите Maven расширить свойства, установив
filtering
в true:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
при этом версия будет обновлена, но, к сожалению, ошибка в Maven предотвращает
${maven.build.timestamp}
свойства${maven.build.timestamp}
к механизму фильтрации ресурсов (подробнее здесь ). Итак, давайте создадим свойствоtimestamp
как обходное решение! Добавьте следующие свойства pom:<properties> <timestamp>${maven.build.timestamp}</timestamp> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format> </properties>
run maven, вы должны найти
info.txt
вtarget/classes
с контентом вроде:version=0.3.2 build.date=2017-04-20T13:56
Чтение pom.xml во время выполнения с использованием модуля maven-model
Другие примеры могут быть лучшим и наиболее стабильным способом получения номера версии в приложение статически . В этом ответе предлагается альтернатива, показывающая, как сделать это динамически во время выполнения, используя библиотеку maven maven-model .
Добавьте зависимость:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
На Java создайте MavenXpp3Reader
чтобы прочитать ваш pom. Например:
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 MavenModelExample {
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