7

我有一個使用Maven構建的Android應用程序。 使用buildnumber-maven-plugin和maven-resources-plugin我將maven項目版本和git commit hash插入到AndroidManifest中。 buildnumber-maven-plugin的create目標在validate階段運行,並且 maven-resources-plugin的目標運行在initialize階段。爲什麼在使用Android Studio/IntelliJ時不能正確執行我的pom?

通過命令行(使用mvn install)構建時,所有工作都正常,並且內部版本號在生成的清單中正確顯示。

但是,當通過Android Studio或IntelliJ構建時,清單中不存在git commit hash(Maven屬性不會用實際值替換),但maven項目版本爲。

爲什麼?



FYI:Android的一個工作室製作之前運行Maven的階段過程中資源,所以它應該工作。

在命令行我使用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

可悲的是我還沒有;作爲解決方法,您可以使用IntelliJ中的maven「install」任務而不是「make」 –

回答

7

IntelliJ擁有自己的內部構建系統,與其他任何IDE非常相似,並且能夠在沒有外部工具的幫助下構建項目。 Intellij還通過解釋項目中的pom.xml並根據您定義的配置構建它來與Maven集成。對於大多數編譯任務來說,這種方式非常有效,但是當您引入更復雜的插件(如buildnumber-maven-plugin)時,它會開始出現問題。不幸的是,IntelliJ沒有內部的equivilent來處理這個插件,所以$ {buildNumber}屬性永遠不會被填充。

可能的解決方法是:

  1. 不要建立與的IntelliJ內置的系統項目,進入「查看」 - >「工具窗口」使用「Maven項目」面板,可以顯示>「Maven項目」。這使您可以訪問所有標準的Maven階段和其他功能。

  2. 在您的IntelliJ「運行配置」中添加一個名爲「buildNumber」的環境變量,併爲其指定任何值,例如:buildNumber = DEV。這將在構建過程中使buildNumber屬性可用,並填充屬性,但不會從SCM更新。

我們對多模塊maven項目使用第一種解決方法,因爲我們也對buildnumber-maven-plugin造成了類似的限制。當我們需要在IntelliJ中運行一個集成測試時,我們也使用瞭解決方案2,因爲我們的代碼需要buildNumber屬性來顯示版本信息,只要我們給它一個值得高興的值。

我希望這對您有些用處,唯一真正的解決方案是讓IntelliJ的內部構建系統瞭解buildnumber-maven-plugin並在構建過程中向環境公開正確的屬性。

+0

但是,它不會**導入POM,它也會*假設*運行Maven階段過程 - 資源,這應該會導致在正在運行的buildnumber插件中。感謝您的答案。就我而言,我擔心的是1.不可接受,因爲很少有開發者會忍受構建時間的增加,但2.可能會這樣做。 我會堅持認爲這是正確的,以留出一些時間來解決任何其他問題。 –

+0

我發現很難找出IntelliJ的編譯器在解釋過去的pom.xml時究竟在做什麼,似乎並沒有太多的信息。我的理解是,IntelliJ在「流程資源」階段(或任何階段)不涉及Maven,但它自己實現了「流程資源」,通過讀取pom.xml –

相關問題