Maven - читать номер версии из файла свойств
Я пытаюсь прочитать мой номер версии сборки из текстового файла и затем назначить ему сгенерированное имя пакета: myRelease-1.1.1.apk, где номер сборки вручную устанавливается в файл свойств
version.number = 1.1.1
Как я могу перегрузить ${version.number} как установленный в pom.xml тем, который находится в файле свойств?
Изменить: более подробную информацию о проекте
, Я использую git для фиксации файла свойств, а затем Дженкинс берет на себя и строит с Maven. Я хотел бы завершить сборку "myBuild-9.9.9.apk". Прямо сейчас у меня есть "myBuild-1.1.2.apk"
В extras/version.properties
project.version=9.9.9
В pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
<parent>
.....
<version>1.1.2</version>
</parent>
<groupId>ca.lapresse.android</groupId>
<artifactId>lapresse-hockey-app</artifactId>
<packaging>apk</packaging>
<name>La Presse Hockey - App</name>
<version>1.1.2</version>
......
Кажется, что ${project.artifactId}
принимает номер версии из <version></version>
, и он становится 1.1.2. Это должно быть отражено в ${project.version}
, которое Im пытается перегрузить из файла свойств.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>${project.basedir}/extras/version.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Что я делаю неправильно и что я вообще не делаю? Мое понимание Maven очень рудиментарно (я исхожу из фона Ant).
Ответы
Ответ 1
Просто, чтобы ответить на мой собственный вопрос: оказывается, что Maven нуждается в настройке свойства, прежде чем что-нибудь может произойти в script. Таким образом, он устанавливается в камне и не может быть модифицирован из файла. Я закончил писать задачу Ant, которая изменяет pom.xml и изменяет версию в файле, прежде чем запускается Maven script. Уродливый и нетривиальный, но он работает.
Ответ 2
Прочтите следующие ответы:
или просто:
<project>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>dev.properties</file> <======== IT IS!!!!!
</files>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
UPDATE Рабочее доказательство концепции - это подпроект в http://sourceforge.net/u/gavenkoa/exp/ci/default/tree/maven/properties/pom.xml
Запустите сборку mvn compile
, проверьте pom.xml
и вывод консоли.
Ответ 3
Поскольку у вас уже есть pom.xml, вам не нужен еще один дополнительный файл свойств для определения такого простого свойства, используйте тег свойств POM и переопределите конструкцию final finalName:
<properties>
<final.build.version>1.1.1</final.build.version>
</properties>
<build>
... ...
<finalName>${project.artifactId}-${final.build.version}</finalName>
... ...
</build>
Если вы используете знак maven и zipalign ваш последний apk на этапе выпуска и хотите переопределить конечное имя здесь, используйте:
<build>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<extensions>true</extensions>
<inherited>true</inherited>
<configuration>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
<sign>
<debug>false</debug>
</sign>
<zipalign>
<verbose>true</verbose>
<inputApk>${project.build.directory}/${project.artifactId}-${final.build.version}.apk</inputApk>
<outputApk>${project.build.directory}/${project.artifactId}-${final.build.version}-signed-aligned.apk</outputApk>
</zipalign>
</configuration>
<executions>
<execution>
<id>alignApk</id>
<phase>package</phase>
<goals>
<goal>zipalign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
EDIT:
Если вам нужно использовать файл свойств, используйте свойства-maven-plugin, посмотрите аналогичный SO question здесь.
Надеюсь на эту помощь.
Ответ 4
Я обнаружил, что могу обойти эту проблему в maven, используя материал о чтении из предложенного выше файла, который работает для фильтрации (помещает материал в файл шаблона свойств), поэтому мое приложение знает, какая версия несмотря на путаницу maven.
Причина, по которой я хотел в файле pom, - поместить номер версии в пару миниатюрных имен файлов javascript, чтобы они не получали кеширование обновлений версий... строго говоря, это не требует фактического номера версии, поэтому я вместо этого использовал ${maven.build.timestamp}
, который выводит дату + время сборки в формате yyyymmdd-hhmm
.
Я думаю, что если бы мне было нужно что-то более сложное, я бы начал собирать вещи в msbuild или что-то подобное вместо этого... Maven не делает ничего проще, и после года сражения я не чувствую, что он становится лучше.