7

У меня есть приложение для Android, которое построено с Maven. Использование модуля buildnumber-maven-plugin и maven-resources-plugin Я вставляю версию проекта maven и хэш-код git в AndroidManifest. create цель buildnumber-maven-plugin запускается в фазе validate и resources. Цель maven-resources-plugin работает в фазе initialize.Почему мой pom не выполняется правильно при использовании Android Studio/IntelliJ?

При построении через командную строку (с mvn install) все работает нормально, и номер сборки отображается правильно в подготовленном манифесте.

Однако при создании через Android Studio или IntelliJ git commit hash отсутствует (свойство Maven не заменяется фактическим значением) в манифесте, но версия проекта maven.

Почему?



FYI: Android-студия запускает Maven фазы процесса-ресурсов перед Make, поэтому он должен работать.

В командной строке я использую Maven 3.0.3, поэтому это может быть проблема с версией (хотя я не могу узнать, какую версию использует IntelliJ).

Вот мой POM выстраивают элемент:

<build> 
    <sourceDirectory>src</sourceDirectory> 
    <testSourceDirectory>test</testSourceDirectory> 

    <resources> 
     <resource> 
      <directory>${project.basedir}</directory> 
      <filtering>true</filtering> 
      <targetPath>${project.build.directory}/filtered-manifest</targetPath> 
      <includes> 
       <include>AndroidManifest.xml</include> 
      </includes> 
     </resource> 
    </resources> 

    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>buildnumber-maven-plugin</artifactId> 
      <version>${maven.buildnumber.version}</version> 
      <configuration> 
       <doCheck>false</doCheck> 
       <doUpdate>false</doUpdate> 
       <shortRevisionLength>6</shortRevisionLength> 
       <revisionOnScmFailure>000000</revisionOnScmFailure> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>create</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>${maven.resources.version}</version> 
      <executions> 
       <execution> 
        <phase>initialize</phase> 
        <goals> 
         <goal>resources</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
      <artifactId>android-maven-plugin</artifactId> 
      <extensions>true</extensions> 
      <configuration> 
       <androidManifestFile>${project.build.directory}/filtered-manifest/AndroidManifest.xml</androidManifestFile> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

И versionName в моем AndroidManifest файла:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.somecompany" 
    android:versionCode="1" 
    android:versionName="${project.version}-${buildNumber}" > 

Из командной строки и $ {project.version} и $ {} BuildNumber заполнены корректно с их значениями, из IntelliJ $ {buildNumber} нет и просто появляется как «$ {buildNumber}»: это указывает (поскольку я установил revisionOnScmFailure), что плагин вообще не запускается.

Я попытался сменить цель create на фазу initialize (на случай, если IntelliJ пропустил validate), но это не имело значения.

+0

Был ли прогресс в этом вопросе? –

+0

К сожалению, у меня еще нет; в качестве обходного пути вы можете использовать задачу «установить» maven из IntelliJ, а не «make» –

ответ

7

IntelliJ имеет собственную внутреннюю систему сборки, как и любую другую IDE, и может создавать проекты без помощи внешних инструментов. Intellij также интегрируется с Maven, интерпретируя pom.xml из вашего проекта и внедряя его для создания на основе конфигурации, которую вы определили. Это очень хорошо работает с большинством задач компиляции, но начинает падать, когда вы вводите более сложные плагины, такие как buildnumber-maven-plugin. К сожалению, IntelliJ не имеет внутреннего эквивалента для обработки этого плагина, поэтому свойство $ {buildNumber} никогда не заполняется.

Возможные обходные пути:

  1. Не строить свой проект с IntelliJ встроенной в систему, используйте «Maven Projects» панель, которые вы можете показать, перейдя в «Просмотр»> «Инструмент Windows» > «Проекты Maven». Это дает вам доступ ко всем стандартным фазам Maven и другим функциям.

  2. В вашей конфигурации IntelliJ «run configuration» добавьте переменную среды, называемую «buildNumber», и дайте ей любое значение, которое вам нравится, например: buildNumber = DEV. Это сделает свойство buildNumber доступным во время процесса сборки и заполнит свойство, однако оно не будет обновляться с вашего SCM.

Мы используем первый обходной путь на Maven проекта мульти-модуля, как мы тоже попали аналогичные ограничения с BuildNumber-Maven-плагин. Мы также используем решение 2, когда нам нужно запустить интеграционный тест в IntelliJ, поскольку свойство buildNumber требуется нашим кодом для отображения информации о версии, если мы придаем ей любую ценность, это радует.

Надеюсь, что это несколько полезно для вас, единственным реальным решением будет внутренняя система сборки IntelliJ, чтобы иметь некоторое представление о buildnumber-maven-plugin и выставлять правильные свойства для среды в процессе сборки.

+0

Но это не ** просто ** импортировать POM, это также * предполагается * для запуска фазовых процессов процесса Maven, что должно привести к в плагине buildnumber. Спасибо за ответы. Насколько я заинтересован в нашем случае 1. не приемлемо, потому что немногие разработчики будут мириться с увеличением времени сборки, но, вероятно, это будет 2.. Я буду придерживаться этой маркировки правильно, чтобы дать некоторое время для любых других ответов. –

+0

Мне было трудно узнать, что делает компилятор IntelliJ на самом деле, когда он интерпретирует pom.xml в прошлом, там, похоже, не так много информации. Мое понимание заключается в том, что IntelliJ не включает maven во время фазы «process-resources» (или любой фазы в этом отношении), но имеет собственную реализацию «ресурсов процесса», которая настраивается путем чтения pom.xml –