Android Studioをバージョン3に更新しましたが、以前にエラーなしでコンパイルされたプロジェクトをコンパイルできなくなったようです。
エラーメッセージは次のとおりです
Error:エラー:commons-loggingは、Androidで現在提供されているクラスと競合するクラスを定義します。ソリューションには、同じ問題のない新しいバージョンまたは代替ライブラリを見つける(たとえば、httpclientの代わりにHttpUrlConnectionまたはokhttpを使用する)か、jarjarなどを使用してライブラリを再パッケージ化することが含まれます。 [DuplicatePlatformClasses]
依存関係は
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:27.0.0'
compile 'com.Android.support:design:27.0.0'
compile 'com.google.api-client:google-api-client-Android:1.23.0' exclude module: 'httpclient'
compile 'com.google.http-client:google-http-client-gson:1.23.0' exclude module: 'httpclient'
compile 'com.google.firebase:firebase-core:11.4.2'
}
とエラーが原因のようです
compile 'com.google.api-client:google-api-client-Android:1.23.0' exclude module: 'httpclient'
compile 'com.google.http-client:google-http-client-gson:1.23.0' exclude module: 'httpclient'
すでにexclude module: 'httpclient'
を使用しているので、なぜコンパイルしないのですか?これはAndroid Studio 3のバグであるか、com.Android.tools.build:gradle:3.0.0
プラグインが含まれているか、何か不足していますか?以前のバージョンでは、まったく同じプロジェクトをコンパイルしても問題ありません。
アプリモジュールにあるbuild.gradle
に追加
configurations {
all {
exclude module: 'httpclient'
}
}
問題がcommons-loggingにある場合は、それも除外する必要があります。 app/build.gradleに次のコードを追加します
configurations {
all {
exclude module: 'httpclient'
exclude module: 'commons-logging'
}
}
プロジェクトフォルダー内のターミナルで実行します。
./gradlew app:dependencies > dependencies.txt
次に、dependencies.txtをチェックして、競合する依存関係を使用しているユーザーを見つけて、それに応じて行動します(更新の確認、削除、または@Silverstormが示唆するexcludeの使用)
同じ問題が発生しました。以下の変更を行いました
configurations {
all{
exclude group: 'commons-logging', module: 'commons-logging'
exclude group: 'org.Apache.httpcomponents'
}
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'org/Apache/http/version.properties'
exclude 'org/Apache/http/client/version.properties'
}
最新のgradleでは廃止されているため、「コンパイル」を「実装」に置き換え、Google APIクライアントライブラリから「org.Apache.httpcomponents」を除外する必要があります。
implementation('com.google.api-client:google-api-client-Android:1.23.0') {
exclude group: 'org.Apache.httpcomponents'
}
implementation('com.google.http-client:google-http-client-gson:1.23.0') {
exclude group: 'org.Apache.httpcomponents'
}
このソリューションはここにありました: https://developers.google.com/google-apps/activity/v1/quickstart/Android
「org.Apache.httpcomponents:httpclient:4.3.3」はSDKバージョン23以降廃止されるため、
これを置き換えます:
compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.Apache.http.client:4.1.2'
と
compile 'org.Apache.httpcomponents:httpclient:4.3.3'
async-http
で続行する場合は、以下のコードをapp/build.gradle
のみに追加します
configurations {
all {
exclude module: 'commons-logging'
}
}
上記のようにcommons-loggingを削除しました。もちろんFatal Exception: Java.lang.NoClassDefFoundError: Failed resolution of: Lorg/Apache/commons/logging/LogFactory;
のある電話でクラッシュしました。 Android APIにこれらのクラスが含まれていないときに、Androidがcommons-loggingがAndroid APIと競合していると主張するにはどうすればよいですか?!? https://developer.Android.com/reference/packages :facepalm:にorg.Apache.commons.loggingはありません。
Build_gradleにimplementation 'commons-logging:commons-logging:1.0.4'
を追加し直しました-Android Studioは赤で下線を引きますが、gradleは問題なくコンパイルします。 :facepalm:
Android:triple_facepalm: