私は、内部使用のためにミニライブラリの小さなセットを作成しました。これは 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にあります。