7

Maven でビルドされた Android アプリケーションがあります。buildnumber-maven-plugin と maven-resources-plugin を使用して、maven プロジェクト バージョンと git commit ハッシュを AndroidManifest に挿入します。createbuildnumber-maven-plugin のゴールはフェーズで実行され、validatemaven resources-resources-plugin のゴールはフェーズで実行されinitializeます。

コマンドラインを使用して ( を使用してmvn install) ビルドすると、すべて正常に動作し、作成されたマニフェストにビルド番号が正しく表示されます。

ただし、Android Studio または IntelliJ を介してビルドする場合、マニフェストには git コミット ハッシュは存在しません (Maven プロパティは実際の値に置き換えられません) が、Maven プロジェクト バージョンは存在します。

なんで?



参考までに: Android Studio は Make の前に 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>

そして、私の AndroidManifest ファイルの versionName は次のとおりです。

<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)、違いはありませんでした。

4

2 に答える 2

8

IntelliJ には、他の IDE と同様に独自の内部ビルド システムがあり、外部ツールの助けを借りずにプロジェクトをビルドできます。また、Intellij は、プロジェクトから pom.xml を解釈し、定義した構成に基づいてビルドするよう指示することで、Maven と統合します。これは、ほとんどのコンパイル タスクでうまく機能しますが、buildnumber-maven-plugin などのより複雑なプラグインを導入すると失敗し始めます。残念ながら、IntelliJ にはこのプラグインを処理するための内部同等物がないため、${buildNumber} プロパティは設定されません。

考えられる回避策は次のとおりです。

  1. IntelliJ の組み込みシステムでプロジェクトをビルドしないでください。[表示] > [ツール ウィンドウ] > [Maven プロジェクト] に移動して表示できる [Maven プロジェクト] パネルを使用してください。これにより、すべての標準 Maven フェーズおよびその他の機能にアクセスできます。

  2. IntelliJ の「実行構成」で、「buildNumber」という環境変数を追加し、好きな値を指定します (例: buildNumber=DEV)。これにより、ビルド プロセス中に buildNumber プロパティが使用可能になり、プロパティが入力されますが、SCM からは更新されません。

buildnumber-maven-plugin で同様の制限が発生したため、マルチモジュール Maven プロジェクトでは最初の回避策を使用します。IntelliJ で統合テストを実行する必要がある場合にもソリューション 2 を使用します。ビルド番号プロパティは、バージョン情報を表示するためにコードで必要とされるためです。

これがお役に立てば幸いです。唯一の本当の解決策は、IntelliJ の内部ビルド システムが buildnumber-maven-plugin をある程度理解し、ビルド プロセス中に環境に正しいプロパティを公開することです。

于 2013-07-25T14:39:29.507 に答える