Я заметил, что в JAR-файле артефакта Maven атрибут project.version включен в два файла:
META-INF/maven/${groupId}/${artifactId}/pom.properties
META-INF/maven/${groupId}/${artifactId}/pom.xml
Есть ли рекомендуемый способ чтения этой версии во время выполнения?
Ответы:
Вам не нужно обращаться к файлам, относящимся к Maven, чтобы получить информацию о версии любой данной библиотеки / класса.
Вы можете просто использовать,
getClass().getPackage().getImplementationVersion()
чтобы получить информацию о версии, которая хранится в .jar-файлахMANIFEST.MF
.К счастью, Maven достаточно умен.К сожалению, по умолчанию Maven также не записывает правильную информацию в манифест!Вместо этого нужно изменить
<archive>
конфигурацию элемента изmaven-jar-plugin
к наборуaddDefaultImplementationEntries
иaddDefaultSpecificationEntries
кtrue
, как это:В идеале эту конфигурацию следует поставить в компанию
pom
или другую базовую помпу.Подробную документацию об
<archive>
элементе можно найти в документации архива Maven .источник
Чтобы проверить ответ выше, для
.war
артефакта я обнаружил, что должен был применить эквивалентную конфигурациюmaven-war-plugin
, а неmaven-jar-plugin
:Эта дополнительная информация о версии для
MANIFEST.MF
в спроецируем.jar
(входит вWEB-INF/lib
из.war
)источник
null
хотя файл MANIFEST.MF в файлах war содержит правильную информацию.<archiveClasses>true</archiveClasses>
- и с тех пор он работает надежно.Вот метод для получения версии из pom.properties, отступая к получению ее из манифеста
источник
Я потратил некоторое время на два основных подхода, и они не сработали для меня. Я использую Netbeans для сборок, может быть, там что-то еще происходит. У меня были некоторые ошибки и предупреждения от Maven 3 с некоторыми конструкциями, но я думаю, что их было легко исправить. Нет, важная персона
Я нашел ответ, который выглядит понятным и простым в реализации в этой статье на DZone:
У меня уже есть подпапка resources / config, и я назвал свой файл app.properties, чтобы лучше отразить то, что мы можем там хранить (например, URL поддержки и т. Д.).
Единственное предостережение заключается в том, что Netbeans выдает предупреждение о том, что среда IDE нуждается в фильтрации. Не уверен, где / как. Это не имеет никакого эффекта в этом пункте. Возможно, есть обходной путь для этого, если мне нужно пересечь этот мост. Удачи.
источник
Я использую
maven-assembly-plugin
для моей Maven упаковки. Использование Apache Maven Archiver в ответе Joachim Sauer также может работать:Поскольку архиватор является одним из общих компонентов maven , он может использоваться несколькими подключаемыми модулями сборки maven, что также может привести к конфликту, если появятся два или более подключаемых модуля, включая
archive
конфигурацию внутри.источник
Чтобы запустить это в Eclipse, а также в сборке Maven, вы должны добавить записи
addDefaultImplementationEntries
иaddDefaultSpecificationEntries
pom, как описано в других ответах, а затем использовать следующий код:Если ваша сборка Java помещает целевые классы где-то, кроме «target / classes», то вам, возможно, потребуется скорректировать значение columnsToRemove.
источник
System.getProperty("user.dir")/pom.xml
. Я вполне уверен, что это будет и для других вещей, за исключением, может быть, не для WTP..getResource()
или.getResourceAsStream()
.В моем весеннем загрузочном приложении решение из принятого ответа работало до тех пор, пока я недавно не обновил свой jdk до версии 12. Также пробовал все остальные ответы и не мог заставить это работать.
В этот момент я добавил строку ниже к первому классу моего весеннего загрузочного приложения, сразу после аннотации
@SpringBootApplication
Позже я использую приведенное ниже, чтобы получить значение из файла свойств в любом классе, который я хочу использовать, и
appVersion
получает версию проекта для меня:Надеюсь, это поможет кому-то.
источник
Простое решение, совместимое с Maven и работающее для любого (а значит, и стороннего) класса:
источник
Вариант Java 8 для EJB в файле war с проектом maven. Проверено на EAP 7.0.
источник