Получите версию артефакта Maven во время выполнения

Я заметил, что в JAR артефакта Maven атрибут project.version включен в два файла:

META-INF/maven/${groupId}/${artifactId}/pom.properties META-INF/maven/${groupId}/${artifactId}/pom.xml 

Есть ли рекомендуемый способ прочитать эту версию во время выполнения?

Вам не нужно обращаться к файлам, определенным в Maven, для получения информации о версии любой данной библиотеки / classа.

Вы можете просто использовать getClass().getPackage().getImplementationVersion() чтобы получить информацию о версии, которая хранится в .jar-файлах MANIFEST.MF . К счастью, Maven достаточно умен. К сожалению, Maven не пишет правильную информацию в манифест, а также по умолчанию!

Вместо этого нужно изменить элемент конфигурации в maven-jar-plugin чтобы установить addDefaultImplementationEntries и addDefaultSpecificationEntries в true , например:

  org.apache.maven.plugins maven-jar-plugin    true true     

В идеале эта конфигурация должна быть помещена в компанию pom или другой базовый pom.

Подробную документацию элемента можно найти в документации Maven Archive .

Чтобы выполнить ответ выше, для артефакта .war , я обнаружил, что мне пришлось применить эквивалентную конфигурацию к maven-war-plugin , а не к maven-jar-plugin :

  maven-war-plugin 2.1    true true     

Это добавило информацию о версии в MANIFEST.MF в MANIFEST.MF .jar проекта (включен в WEB-INF/lib из .war )

Вот способ получения версии из pom.properties, отпавший назад, чтобы получить ее из манифеста

 public synchronized String getVersion() { String version = null; // try to load from maven properties first try { Properties p = new Properties(); InputStream is = getClass().getResourceAsStream("/META-INF/maven/com.my.group/my-artefact/pom.properties"); if (is != null) { p.load(is); version = p.getProperty("version", ""); } } catch (Exception e) { // ignore } // fallback to using Java API if (version == null) { Package aPackage = getClass().getPackage(); if (aPackage != null) { version = aPackage.getImplementationVersion(); if (version == null) { version = aPackage.getSpecificationVersion(); } } } if (version == null) { // we could not compute the version so use a blank version = ""; } return version; } 

Я провел некоторое время на двух основных подходах здесь, и они не работали для меня. Я использую Netbeans для сборки, возможно, там больше происходит. У меня были некоторые ошибки и предупреждения от Maven 3 с некоторыми конструкциями, но я думаю, что их было легко исправить. Нет, biggie.

Я нашел ответ, который выглядит легко и просто реализовать в этой статье на DZone:

  • Штамповка номера версии и времени сборки в файле свойств с Maven

У меня уже есть подкаталог ресурсов / config, и я назвал свой файл: app.properties, чтобы лучше отражать то, что мы можем хранить там (например, URL-адрес поддержки и т. Д.).

Единственное предостережение в том, что Netbeans дает предупреждение о том, что среда IDE нуждается в фильтрации. Не знаете, где / как. На данный момент это не влияет. Возможно, для этого есть работа, если мне нужно пересечь этот мост. Удачи.

Чтобы запустить этот процесс в Eclipse, а также в сборке Maven, вы должны добавить записи pom addDefaultImplementationEntries и addDefaultSpecificationEntries как описано в других ответах, а затем использовать следующий код:

 public synchronized static final String getVersion() { // Try to get version number from pom.xml (available in Eclipse) try { String className = getClass().getName(); String classfileName = "/" + className.replace('.', '/') + ".class"; URL classfileResource = getClass().getResource(classfileName); if (classfileResource != null) { Path absolutePackagePath = Paths.get(classfileResource.toURI()) .getParent(); int packagePathSegments = className.length() - className.replace(".", "").length(); // Remove package segments from path, plus two more levels // for "target/classes", which is the standard location for // classes in Eclipse. Path path = absolutePackagePath; for (int i = 0, segmentsToRemove = packagePathSegments + 2; i < segmentsToRemove; i++) { path = path.getParent(); } Path pom = path.resolve("pom.xml"); try (InputStream is = Files.newInputStream(pom)) { Document doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse(is); doc.getDocumentElement().normalize(); String version = (String) XPathFactory.newInstance() .newXPath().compile("/project/version") .evaluate(doc, XPathConstants.STRING); if (version != null) { version = version.trim(); if (!version.isEmpty()) { return version; } } } } } catch (Exception e) { // Ignore } // Try to get version number from maven properties in jar's META-INF try (InputStream is = getClass() .getResourceAsStream("/META-INF/maven/" + MAVEN_PACKAGE + "/" + MAVEN_ARTIFACT + "/pom.properties")) { if (is != null) { Properties p = new Properties(); p.load(is); String version = p.getProperty("version", "").trim(); if (!version.isEmpty()) { return version; } } } catch (Exception e) { // Ignore } // Fallback to using Java API to get version from MANIFEST.MF String version = null; Package pkg = getClass().getPackage(); if (pkg != null) { version = pkg.getImplementationVersion(); if (version == null) { version = pkg.getSpecificationVersion(); } } version = version == null ? "" : version.trim(); return version.isEmpty() ? "unknown" : version; } 

Если ваша assembly Java ставит целевые classы где-то иначе, чем «target / classes», вам может потребоваться настроить значение segmentToRemove.

Я использую maven-assembly-plugin для своей корзины maven. Использование Apache Maven Archiver в ответе Йоахима Зауэра также может работать:

  org.apache.maven.plugins maven-assembly-plugin   jar-with-dependencies    true true        

Поскольку архиватор является одним из общих компонентов maven , его можно использовать несколькими плагинами построения maven, которые также могут иметь конфликт, если в него вставляются два или более плагинов, включая внутреннюю конфигурацию archive .

Вариант Java 8 для EJB в военном файле с проектом maven. Протестировано на EAP 7.0.

 @Log4j // lombok annotation @Startup @Singleton public class ApplicationLogic { public static final String DEVELOPMENT_APPLICATION_NAME = "application"; public static final String DEVELOPMENT_GROUP_NAME = "com.group"; private static final String POM_PROPERTIES_LOCATION = "/META-INF/maven/" + DEVELOPMENT_GROUP_NAME + "/" + DEVELOPMENT_APPLICATION_NAME + "/pom.properties"; // In case no pom.properties file was generated or wrong location is configured, no pom.properties loading is done; otherwise VERSION will be assigned later public static String VERSION = "No pom.properties file present in folder " + POM_PROPERTIES_LOCATION; private static final String VERSION_ERROR = "Version could not be determinated"; { Optional.ofNullable(getClass().getResourceAsStream(POM_PROPERTIES_LOCATION)).ifPresent(p -> { Properties properties = new Properties(); try { properties.load(p); VERSION = properties.getProperty("version", VERSION_ERROR); } catch (Exception e) { VERSION = VERSION_ERROR; log.fatal("Unexpected error occured during loading process of pom.properties file in META-INF folder!"); } }); } } 
  • Как добавить дополнительный исходный каталог для maven для компиляции и включения в сборку jar?
  • Maven родительский pom vs modules pom
  • Как прочитать файл внешних свойств в Maven
  • Могу ли я использовать путь к зависимости от Maven как свойства?
  • Получите исходные файлы jar, прикрепленные к Eclipse для зависимых от Maven зависимостей
  • Не удалось выполнить цель org.apache.maven.plugins: maven-surefire-plugin: 2.10: test
  • Maven проверяет наличие обновленных зависимостей в репозитории
  • Как создать график зависимости между всеми модулями проекта Maven?
  • Использование API-интерфейса Nexus для получения последней версии артефакта для данного groupid / artifactId
  • Maven GWT 2.0 и Eclipse
  • Как вручную установить артефакт в Maven 2?
  • Interesting Posts

    Android Studio не смог найти действительный Jvm (относящийся к MAC OS)

    Проводка данных JSON через jQuery для действия controllerа ASP.NET MVC 4

    Как передать аргументы из командной строки в gradle

    Android: сохранить сервис, когда приложение убито

    Как преобразовать физическую машину OS X в виртуальную машину

    используя objc_msgSend для вызова функции Objective C с именованными аргументами

    Генератор случайных чисел в C # – уникальные значения

    Выполнение нескольких команд в одной строке в оболочке

    Преобразование строки в DateTime

    Как я могу назначить идентификатор для просмотра программно?

    Каковы преимущества и недостатки использования GAC?

    Какие хорошие право-ассоциативные методы в Scala?

    Принудительное обновление приложения для Android, когда доступна новая версия

    Как индексировать векторную последовательность в векторной последовательности

    Функция pthread из classа

    Давайте будем гением компьютера.