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