Номер версии Maven в Java-файле - PullRequest
17 голосов
/ 12 января 2012

Я пришел из ANT, где вы можете вызвать файл .java для получения номера версии с помощью какого-либо метода.Я хотел бы сделать нечто подобное в моем новом файле pom.xml, чтобы автоматически получить правильный номер версии.Мне нужно, чтобы приложение знало о его собственной версии, и в то же время Maven, чтобы узнать о полученной версии, делает правильные сборки.Удерживать информацию о версии в двоичном виде нельзя.

Или Maven может создать новый файл .java во время / перед сборкой?

Я могу представить немало способов добиться этого, но есть ли лучший способ сделать это в проекте Maven?

Ответы [ 5 ]

26 голосов
/ 12 января 2012

При создании JAR Maven записывает файл pom.xml и pom.properties в каталог META-INF/maven/[group ID]/[artifact ID]. Затем вы можете прочитать версию одного из них в вашем приложении.

Кроме того, вы можете явно написать новый файл version.properties, используя фильтрация ресурсов .

Если вы добавите в свой POM следующее:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

и затем поместите шаблон version.properties в каталог src / main / resources, который выглядит следующим образом:

version = ${project.version}

Maven заменит версию, считанную из POM, и вашему приложению нужно просто прочитать ресурс version.properties и запросить ключ version.

1 голос
/ 12 января 2012

Возможно, если вы подробнее остановитесь на этом требовании, мы сможем помочь вам найти более элегантное решение вашей проблемы. Действительно, что это за второе приложение, запускается ли оно из Maven, и если да, то на каком этапе процесса сборки оно запускается? Как взаимодействуют это приложение и Maven?

Есть много способов, которыми это может быть достигнуто, но выбор правильного во многом зависит от вашей конкретной ситуации, в вашем вопросе недостаточно информации для более глубокого поиска более комплексного решения. Тем не менее, на ум приходит следующее:

  • Внешние свойства : вы можете создать файл свойств внешне или напрямую из процесса сборки Maven. затем вы можете прочитать этот файл свойств из вашего другого приложения.

  • Фильтрация. Как уже упоминалось, Maven может фильтровать файл ресурсов. Этот файл может быть файлом Java, в который вы вставляете номер текущей версии и вызываете этот файл из другого приложения.

  • Вызовите ваше приложение из сборки Maven и передайте аргументы: вы можете использовать плагин exec и вызывать ваше приложение как подпроцесс Maven, передавая номер текущей версии $ {project.version }.

  • Интегрируйте свою старую сборку Ant в Maven: вы можете напрямую вызвать некоторые фрагменты Ant или завершить сборку ant из Maven. Это даст вам гибридную систему сборки, которая, вероятно, не самая лучшая, но все же даст вам некоторую свободу действий в процессе миграции и позволит управлять старыми сценариями Ant, медленно перемещая фрагменты функциональности в Maven. Не то, чтобы это не обязательно было плохо, скажем, иметь сочетание двух, просто Maven предоставляет множество жестких или квази-жестких соглашений о конфигурации, которые могут помешать сценарию Ant. В этом отношении может быть трудно заставить обоих хорошо играть друг с другом.

  • Управляйте сборкой Maven из ant : вы также можете сделать обратное, то есть вывести процесс сборки Maven из ant, сохраняя контроль над тем, как вы называете свою другую систему. Интегрируя правильные вещи (такие как свойства или фильтр), вы можете гарантировать, что Maven сгенерирует необходимый артефакт из конкретного проекта, который вы сможете использовать позже в своем скрипте Ant. Обратите внимание, что документы для этой задачи не очень сложны, вам, возможно, придется немного повозиться, чтобы заставить его работать, но, по крайней мере, вы окажетесь в знакомой среде.

Без дополнительной информации о том, как эти две системы взаимодействуют и зачем вам нужна эта информация, вам будет трудно копнуть глубже.

Надеюсь, это поможет

1 голос
/ 12 января 2012

Я отошлю вас к этой теме на SO: Как прочитать файл внешних свойств в Maven . В частности, ознакомьтесь с ответом Dougnukem, в котором описано, как прочитать файл внешних свойств в Maven. Вы можете использовать это как общий источник для управления номером версии как в вашем скрипте сборки Maven, так и в приложении Java.

0 голосов
/ 06 декабря 2016

Я понимаю, что на это ответили давно, но я придумал новый поворот в ответе, который некоторые могут найти полезным.

У меня есть плагин replacer, меняющий строку в файле Java на каждой сборке MAVEN. Таким образом, если pom.xml когда-либо обновляет номер версии проекта pom, он автоматически отражается в исходном файле Java.

СКАЗАТЬ МАВЕНУ О replace Цель:

<build>
    ...
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        com.google.code.maven-replacer-plugin
                                    </groupId>
                                    <artifactId>
                                        replacer
                                    </artifactId>
                                    <versionRange>
                                        [1.5.3,)
                                    </versionRange>
                                    <goals>
                                        <goal>replace</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <execute />
                                    <runOnIncremental>true</runOnIncremental>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    ...
</build>

РАССКАЗАТЬ МАВЕНУ, ЧТОБЫ ЗАПОЛНИТЬ ТЕКУЩЕЕ ИМЯ И ВЕРСИЮ:

(Если хотите, укажите полный подпуть в basedir и удалите **/ из включенного имени файла.)

<build>
    ...
    <plugins>
        <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>replacer</artifactId>
            <version>1.5.3</version>
            <executions>
                <execution>
                    <id>replace-version-number</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <basedir>${project.basedir}/src/main/java</basedir>
                <includes>
                    <include>**/Constants.java</include>
                </includes>
                <preserveDir>true</preserveDir>
                <replacements>
                    <replacement>
                        <token>mavenProjectName = ".*"</token>
                        <value>mavenProjectName = "${project.name}"</value>
                    </replacement>
                    <replacement>
                        <token>mavenProjectVersion = ".*"</token>
                        <value>mavenProjectVersion = "${project.version}"</value>
                    </replacement>
                </replacements>
            </configuration>
        </plugin>
        ....
    </plugins>
    ...
</build>

IN Constants.java:

...
private static final String mavenProjectName = "";
private static final String mavenProjectVersion = "";
...

Значения заполняются значениями POM в фазе generate_sources перед фазой компиляции.

Подстановочный знак .* в токене заменителя означает, что значение обновляется, даже если вы проверяете обновленную копию в системе контроля версий.

0 голосов
/ 12 января 2012

Непонятно, на какой номер версии вы ссылаетесь, и почему он должен быть в Java-файле. Однако если вы пытаетесь присвоить номер версии своему проекту, следуйте стандартному соглашению Maven. Вот пример:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myco.abc</groupId>
  <artifactId>myapp</artifactId>
  <packaging>war</packaging>
  <version>1.0.0-SNAPSHOT</version>

  <name>My App</name>
  <description>My application description.</description>
  <url>http://myapp.myco.com</url>
....
...