8

私は、内部使用のためにミニライブラリの小さなセットを作成しました。これは Maven を使用して構築されたセットです。ライブラリは、「通常の」Java、GWT、および Android を対象としています。それらのいくつかは、GWT や Android で実行するつもりがなかったため、Java 8 で作成されています。したがって、他のライブラリは、これら 2 つをサポートするために古い Java 6 で作成されています。ライブラリを (言語機能に関して) Java 8 に完全に移行する計画があり、まだリリースされていない GWT 2.8.0 で Java 8 の書き直されたライブラリを実行することに成功しました。ただし、Java 8 で書き直されたライブラリを Android アプリケーション用にコンパイルすることはできません。問題は、Retrolambda (retrolambda-maven-pluginプラグイン) が現在の Maven モジュール クラスのみを処理できるように見え、依存クラスを完全に無視することです。したがって、android-maven-pluginターゲット アプリケーションのビルドは次のように中断されます。

[INFO] UNEXPECTED TOP-LEVEL EXCEPTION:
[INFO] com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
[INFO]  at com.android.dx.command.dexer.Main.processClass(Main.java:665)
[INFO]  at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
[INFO]  at com.android.dx.command.dexer.Main.access$600(Main.java:78)
[INFO]  at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
[INFO]  at com.android.dx.command.dexer.Main.processOne(Main.java:596)
[INFO]  at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
[INFO]  at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
[INFO]  at com.android.dx.command.dexer.Main.run(Main.java:230)
[INFO]  at com.android.dx.command.dexer.Main.main(Main.java:199)
[INFO]  at com.android.dx.command.Main.main(Main.java:103)
[INFO] ...while parsing foo/bar/FooBar.class

retrolambda-maven-plugin次のように構成されます。

<plugin>
    <groupId>net.orfjackal.retrolambda</groupId>
    <artifactId>retrolambda-maven-plugin</artifactId>
    <version>2.0.2</version>
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>process-main</goal>
                <goal>process-test</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <target>1.6</target>
        <defaultMethods>true</defaultMethods>
    </configuration>
</plugin>

ライブラリ クラスとすべての依存関係を処理するように Retrolambda プラグインを構成することは可能ですか? それとも、別のバイトコード処理ツールを使用できますか?


更新 #1

Retrolambdaの失敗については間違っていると思います。もう少し掘り下げてみると、インストルメント化されていない JAR ファイルがディレクトリandroid-maven-pluginからではなく、Maven リポジトリから直接選択されるため、それが原因であることがわかりました。target詳細ログを有効にすると、 によって呼び出されたこの疑似コード コマンドが検出されましたandroid-maven-plugin

$JAVA_HOME/jre/bin/java
-Xmx1024M
-jar "$ANDROID_HOME/sdk/build-tools/android-4.4/lib/dx.jar"
--dex
--output=$BUILD_DIRECTORY/classes.dex
$BUILD_DIRECTORY/classes
$M2_REPO/foo1/bar1/0.1-SNAPSHOT/bar1-0.1-SNAPSHOT.jar
$M2_REPO/foo2/bar2/0.1-SNAPSHOT/bar2-0.1-SNAPSHOT.jar
$M2_REPO/foo3/bar3/0.1-JAVA-8-SNAPSHOT/bar3-0.1-JAVA-8-SNAPSHOT.jar

私の考えは、maven-dependency-pluginプラグインを実行してこれら 3 つのアーティファクトを$BUILD_DIRECTORY/classesディレクトリに取得し、retrolambda-maven-pluginインストルメントに依存関係を持たせることです。まあ言ってみれば:

ステップ 1: 依存関係をターゲット ディレクトリにコピーする

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>process-classes</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includeScope>runtime</includeScope>
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

ステップ 2: Retrolambda を使用してコピーした依存関係を計測する

呼び出すretrolambda-maven-plugin

ステップ 3: DEX ファイルをコンパイルする

ターゲットディレクトリにコピーされた依存関係を除いて呼び出しandroid-maven-pluginます。それらはすべてターゲットディレクトリにあるはずです

しかし、これも失敗します。なぜなら、アーティファクトがandroid-maven-plugin.

アーティファクトがインストルメント化されていない状態で保存されているリポジトリからフェッチされないようにするにはどうすればよいですか?

私のプラグイン構成:

  • org.apache.maven.plugins:maven-dependency-plugin:2.10
  • net.orfjackal.retrolambda:retrolambda-maven-plugin:2.0.2
  • com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.9.0-rc.3

更新 #2

Simpligility チームは、以下に説明するシナリオを特徴とする Android Maven Plugin 4.4.1 をリリースしました。詳細については、プラグインの変更ログを参照してください。

<plugin>
    <groupId>com.simpligility.maven.plugins</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <version>4.4.1</version>
</plugin>

サンプル シナリオはhttp://simpligility.github.io/android-maven-plugin/instrumentation.htmlにあります。

4

1 に答える 1