Відповіді:
Якщо припустити, що ви використовуєте Java, ви можете
Створіть .properties
файл у (найчастіше) вашому src/main/resources
каталозі (але на кроці 4 ви можете сказати, щоб він шукав в іншому місці).
Встановіть значення деякого властивості у вашому .properties
файлі, використовуючи стандартну властивість Maven для версії проекту: foo.bar=${project.version}
У свій код Java завантажте значення з файлу властивостей як ресурс з classpath (google для рясних прикладів того, як це зробити, але ось приклад для початківців ).
У Maven увімкніть фільтрацію ресурсів - це призведе до того, що Maven скопіює цей файл у свої вихідні класи та перекладе ресурс під час цієї копії, інтерпретуючи властивість. Ви можете знайти тут трохи інформації, але ви здебільшого просто робите це у своєму пам’яті:
<будувати> <ресурси> <ресурс> <directory> src / main / ресурси </directory> <filtering> true </filtering> </resource> </resources> </build>
Ви також можете дістатись до інших стандартних властивостей, таких як project.name
, project.description
або навіть довільних властивостей, які ви вводите в свій пом <properties>
і т.д. Якщо ви вкажете профіль під час виконання -PmyProfile
, це може ввімкнути властивості, які потім можуть відображатися у вашій збірці.
src/main/resources
, оскільки це може обробити всі файли, що знаходяться в цьому каталозі, включаючи файли бінарних файлів. Щоб уникнути непередбачуваної поведінки, краще виконати фільтрацію за src/main/resources-filtered
каталогом, як тут запропоновано . У будь-якому випадку, дякую за цей приємний трюк!
Прийнята відповідь може бути найкращим і найстабільнішим способом статичного введення номера версії в додаток , але насправді не відповідає початковому запитанню: Як отримати номер версії артефакту з 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());
}
}
package
d jar (класи залежностей не інтегровані) та не працює, коли пакується із плагіном maven-Assembly-плагін, який jar-with-dependencies
я отримую a java.io.FileNotFoundException: pom.xml
(це в остаточній банці як META-INF/maven/my.package/myapp/pom.xml
) - будь-які підказки, як це вирішити?
Упаковані артефакти містять 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 ). Якщо це питання для вас, то шлях, описаний Алексом, - це шлях.
Існує також метод, описаний у Простий спосіб відображення номера версії додатків за допомогою 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()
Я знайшов цей метод більш простим.
getImplementationVersion()
було null
. (версія Maven 3.0.4)
.war
артефактів не забудьте використовувати maven-war-plugin
замістьmaven-jar-plugin
getImplementationVersion()
повертає null).
Якщо ви використовуєте mvn упаковку, таку як баночка чи війна, використовуйте:
getClass().getPackage().getImplementationVersion()
Він зчитує властивість "Впровадження-версія" згенерованого META-INF / MANIFEST.MF (що встановлено у версії pom.xml) в архіві.
Щоб доповнити те, що опублікував @kieste, я вважаю, що це найкращий спосіб забезпечити доступ до Maven збирати інформацію у своєму коді, якщо ви використовуєте Spring-boot: документація на http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # інформація про виробництво, готове до застосування є дуже корисним.
Вам просто потрібно активувати приводи та додати потрібні властивості у свій 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@
Використовуйте цю бібліотеку для зручності простого рішення. Додайте до маніфесту все, що вам потрібно, а потім запитуйте за рядком.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Іноді командного рядка Maven достатньо для створення сценаріїв, що стосуються версії проекту, наприклад, для пошуку артефактів через URL-адресу з сховища:
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
<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>
З посиланням на відповідь ketankk :
На жаль, додавши це зіпсуто з тим, як моя програма поводилася з ресурсами:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Але використовуючи цей всередині тегу <manifest> плагін maven-assemble-plugin, вдалося зробити таке:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
Тож я зміг отримати версію з використанням
String version = getClass().getPackage().getImplementationVersion();