run
my Android Androidデバイス上のアプリケーション)を実行しようとすると、gradleコンソールは次のエラーを報告します:
Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.Android.build.api.transform.TransformException: Java.util.Zip.ZipException: duplicate entry: com/loopj/Android/http/AsyncHttpClient$1.class
「AsyncHttpClient」クラスを検索すると、実際には次の2つの場所にあることがわかります。
/Users/Afflatus/.gradle/caches/modules-2/files-2.1/com.loopj.Android/android-async-http/1.4.9/5d171c3cd5343e5997f974561abed21442273fd1/Android-async-http-1.4.9-sources.jar!/com/loopj/Android/http/AsyncHttpClient.Java
/Users/Afflatus/.ideaLibSources/Android-async-http-1.4.9-sources.jar!/com/loopj/Android/http/AsyncHttpClient.Java
最初のパスはそれが「キャッシュ」ファイルであることを示唆しているようです...なので、私はinvalidating & restarting my cache
ですが、gradleが再構築され、アプリケーションをrun
しようとした後も、両方のファイルが残っています。私は別の posts で読みましたが、ファイルの1つを削除することで解決できます...それで、キャッシュの場所に行き、「1.4.9」フォルダーにあるすべてのファイルを削除しました。 ..残念ながら、再度開いた後Android Studioの場合、新しいキャッシュファイルが作成され、同じエラーが発生します。
他の投稿( ここ 、 ここ 、 ここ 、および ここ )は、「./ gradlew clean」を追加した場合に提案します(私が理解している限り)ルートディレクトリに再度実行するためだけ、gradleを再構築します。だから私もそれをやってみました:
これにより、アプリのフォルダーは次のようになります。
しかし、残念ながら、それでも私が同じエラーを受け取ることにはなりませんでした。何が悪いのですか?私は何をすべきですか?
libs
フォルダーに2回ライブラリーを追加したため、これはlibs
フォルダーに同じライブラリーの複数のバージョンがある場合に発生することがあります。それを確認し、重複するjarファイルを削除してください。
2番目のオプションは、gradle.build
に依存関係を追加し、libs
フォルダーにjarを含めることもできます。
そのため、両方の場所を確認して重複するエントリを削除し、クリーンしてAPK
を再度ビルドします。
それが役に立てば幸い
私の場合、gradleでsensorocloud.jar
とcompile 'com.loopj.Android:android-async-http:1.4.9'
を使用しているため、同じエラーが発生しました。 sensoroクラウドSDKはloopjのasync-http
を使用したためです。
Jarファイル内の重複する.class
ファイルを手動で削除することで解決できました。 (すなわち.
com.loopj.Android
.class
ファイルを削除する)(PS私は、gradleでjarの特定のクラスを除外できるかどうかを確認するためにWebを検索しようとしましたが、成功しませんでした。たとえば、参照しました this SO post )
libs
フォルダー内の重複するjar拡張子を持つファイルを削除します。ただし、重複ファイルがなく、"Duplicate classes"
エラーがある場合は、エラーセクションの残りの「Duplicate classes ....」句で名前を探してください。たとえば、"duplicated classes 'dagger' bla bla"
です。 libs
フォルダから'dagger'
という名前のファイルを削除します。 (シフトで削除しないように注意してください。)
重複するクラス例外は、依存関係の1つが、プロジェクトで使用しているライブラリの古いバージョンまたは新しいバージョン(+付き)を暗黙的に使用することを意味します。
この問題を解決するには、そのようなコードブロックを'force'
ファイル(モジュール:アプリ)に追加します(ライブラリバージョンをbuild.gradle
の後に配置します)。
configurations {
all {
resolutionStrategy {
// do not upgrade above 3.12.0 to support API < 21 while server uses
// COMPATIBLE_TLS, or okhttp3 is used in project
force 'com.squareup.okhttp3:okhttp:3.12.0'
force 'com.squareup.okhttp3:logging-interceptor:3.12.0'
}
}
}
依存関係から一部のグループを除外することもできます。単一の依存関係については、次のように記述します。
dependencies {
// example
implementation('log4j:log4j:1.2.15') {
exclude group: 'javax.jms', module: 'jms'
}
}
Android Studio with Gradle Plugin version 3.4.2
and Gradle version 5.4.1
。