什么"程序类型已经存在"意思?

时间:2018-04-05 15:27:22

标签: android android-studio gradle

我正在尝试在Android Studio中构建应用。将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/' }
} 

10 个答案:

答案 0 :(得分:45)

此问题通常来自命名冲突,在您的情况下是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

我们发现地图上的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模块不会因测试你的代码而中断。

答案 1 :(得分:5)

来自official Doc

如果一个类在运行时类路径上多次出现,则会出现类似以下错误:

Program type already present com.example.MyClass

通常由于以下情况之一而发生此错误:

  • 二进制依赖项包括一个库,您的应用程序还包含一个直接依赖项。

    例如,您的应用声明了对库A和库B的直接依赖关系,但是库A已在其二进制文件中包含库B。 要解决此问题,请删除库B作为直接依赖项。

  • 您的应用在同一库上具有本地二进制依赖关系和远程二进制依赖关系。

    要解决此问题,请删除二进制依赖项之一。 (查看是否添加了相同的库作为jar和gradle依赖项)

答案 2 :(得分:5)

对我来说,清洁该项目解决了该问题

./gradlew clean

答案 3 :(得分:4)

这也发生在我身上,但就我而言,我尝试使用debugApiApi包含具有相同类的不同依赖项,因此Android Studio被标记为重复类,因此我通过使用解决了此问题debugApireleaseApi包括基于构建变体的不同依赖项。

答案 4 :(得分:3)

将支持库添加到应用级Gradle文件

  

实现'com.android.support:design:27.1.0'

答案 5 :(得分:2)

就我而言,这意味着我在源代码中的某些位置有2个* .jar文件或2个库。 例如:我在youtube.jarapp/libary中有2个module/libary 删除一次冗余就可以了

答案 6 :(得分:1)

此问题的问题-如果您将该库用作模块,并将同一库用作依赖关系的另一个库。

示例: LibraryA 作为模块导入,并且相同的 LibraryA 作为依赖关系添加到任何其他库模块中。

如何解决此问题?

解决方案1->如果要同时保留它们->只需重构 LibraryA 模块的软件包名称

解决方案2->删除 LibraryA 依赖项并使用模块

实施项目(':LibraryA')

答案 7 :(得分:0)

我希望它可以帮助某人, Build> Clean Project为我工作。

答案 8 :(得分:0)

从Android Studio 4.0.2更新到4.1后,我的项目的内部库出现了相同的问题。我搜索并尝试了许多尝试,但均未成功。如果你们和我有同样的情况,希望这个答案能对您有所帮助。我所做的:

  1. Clean Project然后Rebuild Project-失败
  2. Invalidate Caches / Restart-失败
  3. 删除全局Gradle缓存(对于macOS为/User/username/.gradle/caches)-失败
  4. 通过终端使用以下命令调查应用程序依赖性:./gradlew app:dependencies 通过Gradle工具窗口:project->Tasks->android->androidDependencies-没什么可疑的
  5. 从我的根项目中删除.gradle.idea-成功(尽管我不确定是否需要删除两者。也许只是删除其中一个也可以工作)

答案 9 :(得分:0)

我收到此错误的原因是因为我将 Java 文件转换为 Kotlin 文件,如下所示:

Code (menu) -> Convert Java file to Kotlin file

旧的 Java 类一定仍然在类路径上徘徊,导致重复。做一个干净的修复它:

Build (menu) -> Clean Project