web-dev-qa-db-ja.com

「プログラムの種類は既に存在します」とはどういう意味ですか?

Android St​​udioでアプリを構築しようとしています。 Eclipse Pahoライブラリをgradle依存関係として追加した後(またはMavenですか?Androidエコシステムは初めてです)、次のエラーが発生しました。

Program type already present: Android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat
Message{kind=ERROR, text=Program type already present: Android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat, sources=[Unknown source file], tool name=Optional.of(D8)}

このエラーに関連するさまざまなStackOverflowの質問を確認しましたが、回答はすべて特定のライブラリに固有のものです。 エラーの解決策だけでなく、エラーの意味の理解も探しています。そのように人々が特定のケースの解決策を見つけやすくなります。これまでのところ、答えはありません。

他のStackOverflowの回答から、それが私のgradleファイルと関係があることを集めました。したがって、app/build.gradleは次のとおりです。

apply plugin: 'com.Android.application'
Android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "---REDACTED FOR PRIVACY---"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.Android.support:appcompat-v7:27.1.0'
    implementation 'com.Android.support:support-media-compat:27.1.0'
    implementation 'com.Android.support:support-v13:27.1.0'
    implementation 'com.google.Android.gms:play-services-maps:12.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.Android.support.test:runner:1.0.1'
    androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.1'
    implementation 'com.Android.support.constraint:constraint-layout:1.0.2'
    implementation 'org.Eclipse.paho:org.Eclipse.paho.client.mqttv3:1.0.2'
    implementation 'org.Eclipse.paho:org.Eclipse.paho.Android.service:1.0.2'
}

repositories {
    maven { url 'https://repo.Eclipse.org/content/repositories/paho-releases/' }
} 
55
user2102929

この問題は、通常、名前の競合、場合によっては複数のライブラリで使用されるsupport-v4ライブラリに起因します。

モジュールの依存関係のリストを見つけるためにapp(アプリのデフォルトのモジュール名)gradlew app:dependenciesを実行して、すべてのライブラリのリストを取得できます。

support-v4が使用されていることがわかりました:

//short version of the dependencies list highlighting support-v4
+--- com.Android.support:support-v13:27.1.0
|    \--- com.Android.support:support-v4:27.1.0

+--- com.google.Android.gms:play-services-maps:12.0.1
|    +--- com.google.Android.gms:play-services-base:12.0.1
|    |    +--- com.google.Android.gms:play-services-basement:12.0.1
|    |    |    +--- com.Android.support:support-v4:26.1.0 -> 27.1.0 (*)

+--- org.Eclipse.paho:org.Eclipse.paho.Android.service:1.0.2
|    +--- com.google.Android:support-v4:r7  // <- problem here

Mapsのsupport-v4では、support-v13から提供されるバージョンが使用されることがわかります。

また、Eclipseライブラリが別のバージョン(r7 ??)を使用していることもわかります。

問題を解決するには、次のように、このEclipseライブラリからsupport-v4モジュールを除外してみてください。

implementation ('org.Eclipse.paho:org.Eclipse.paho.Android.service:1.0.2') {
    exclude module: 'support-v4'
}

その後、アプリケーションをコンパイルできるはずです。

ところで、コードをテストすることでEclipseモジュールが壊れないように注意する必要があります。

54
xiaomi

私にとってはクリーニングプロジェクトは問題を解決しました

./gradlew clean
14
MujtabaFR

公式ドキュメント から

クラスがランタイムクラスパスに複数回表示されると、次のようなエラーが表示されます。

Program type already present com.example.MyClass

このエラーは通常、次のいずれかの状況が原因で発生します。

  • バイナリ依存関係には、アプリが直接依存関係として含むライブラリが含まれます。

    たとえば、アプリはライブラリAとライブラリBへの直接の依存関係を宣言していますが、ライブラリAは既にバイナリにライブラリBを含んでいます。この問題を解決するには、直接の依存関係としてライブラリBを削除します。

  • アプリには、同じライブラリに対するローカルバイナリ依存関係とリモートバイナリ依存関係があります。

    この問題を解決するには、バイナリ依存関係のいずれかを削除します。 (同じライブラリがjarおよびgradle依存関係として追加されているかどうかを確認してください)

5
Manohar Reddy

アプリレベルのGradleファイルにサポートライブラリを追加する

実装 'com.Android.support:design:27.1.0'

3
Phani varma