Ответы:
Предполагая, что вы используете Java, вы можете
Создайте .properties
файл в (чаще всего) вашем src/main/resources
каталоге (но на шаге 4 вы можете указать, чтобы он смотрел в другом месте).
Установите значение некоторого свойства в вашем .properties
файле, используя стандартное свойство Maven для версии проекта: foo.bar=${project.version}
В своем коде Java загрузите значение из файла свойств в качестве ресурса из classpath (в Google приведены обильные примеры того, как это сделать, но вот пример для начала ).
В Maven включите фильтрацию ресурсов - это заставит Maven скопировать этот файл в ваши выходные классы и перевести ресурс во время этой копии, интерпретируя свойство. Вы можете найти некоторую информацию здесь, но в основном вы просто делаете это в своей помпе:
<Сборка> <ресурсы> <Ресурс> <Каталог> SRC / основные / ресурсы </ каталог> <Фильтрация> True </ фильтрация> </ Ресурс> </ Ресурсы> </ Сборки>
Вы также можете получить другие стандартные свойства, такие как project.name
, project.description
или даже произвольные свойства, которые вы указали в pom <properties>
и т. Д. Фильтрация ресурсов в сочетании с профилями Maven может дать вам поведение при сборке во время сборки. Когда вы указываете профиль во время выполнения -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 (классы зависимостей не интегрированы), и не работает, когда jar-with-dependencies
я получаю пакет с подключаемым плагином maven. a java.io.FileNotFoundException: pom.xml
(это в последнем jar как 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()
возвращает ноль).
Если вы используете упаковку mvn, такую как jar или war, используйте:
getClass().getPackage().getImplementationVersion()
Он читает свойство «Version-реализации» сгенерированного файла META-INF / MANIFEST.MF (для которого установлена версия pom.xml) в архиве.
В дополнение к тому, что опубликовал @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@
Используйте эту библиотеку для простоты простого решения. Добавьте в манифест все, что вам нужно, а затем выполните запрос по строке.
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>
Со ссылкой на ответ кетанкка :
К сожалению, добавление этого связано с тем, как мое приложение работает с ресурсами:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Но с помощью этого тега <manifest> maven-assembly-plugin все получилось:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
Таким образом, я смог получить версию, используя
String version = getClass().getPackage().getImplementationVersion();