Подтвердить что ты не робот

Номер версии Maven в java файле

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

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

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

4b9b3361

Ответ 1

При создании 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.

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

Неясно, к какому номеру версии вы обращаетесь, и почему это должно быть в файле 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>
....

Ответ 5

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

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

СДЕЛАТЬ СЕЙЧАС О цели replace:

<build>
    ...
    <pluginManagement>
        <plugins>
            <!--This plugin 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 перед фазой компиляции.

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