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 не делает ничего проще, и после года сражения я не чувствую, что он становится лучше.