Поиск…


Вступление

Иногда полезно использовать свойства 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 и время сборки.

  1. создайте src/main/resources/info.txt со следующим содержимым:

    version = $ {pom.version} build.date = $ {timestamp}

  2. попросите Maven расширить свойства, установив filtering в true:

     <build>
         <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
         </resources>
     </build>
    
  3. при этом версия будет обновлена, но, к сожалению, ошибка в 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>
    
  4. 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow