当前位置: 首页 > 知识库问答 >
问题:

如何使用gradle从maven repo中正确删除可传递依赖项

慕容玉书
2023-03-14

我在构建项目时收到以下错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Lorg/slf4j/impl/StaticLoggerBinder;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)

据我所知,这是因为我有多个依赖于slf4j的库。我的构建中的依赖项。gradle文件是:

dependencies {
    compile project(':libraries:some-sdk')
    compile files('libs/some-library.jar')
    compile 'com.some-module:some-artifact:X.X.X'
    compile 'com.github.tony19:logback-android-classic:1.1.1-3'
}

我知道logback-android-经典依赖是个问题,因为它确实依赖于slf4j,如果我把它注释掉,我的项目构建很好。根据其他消息来源,我发现这通常通过排除传递依赖来解决,如下所示:

compile('com.github.tony19:logback-android-classic:1.1.1-3') {
    exclude group: 'org.slf4j'

然而,即使在我清理和重建后,我仍然得到了错误。

更新:运行dependencyInsight查找dmahapatro建议的slf4j未返回任何结果:

$ gradle -q dependencyInsight --dependency slf4j --configuration compile
No dependencies matching given input were found in configuration ':main:compile'

我的完整依赖树是:

+--- project :stripe
+--- project :apptentive-android-sdk
+--- project :numberpicker
+--- project :switch-backport
+--- org.jsoup:jsoup:1.7.3
+--- org.ocpsoft.prettytime:prettytime:3.2.4.Final
+--- org.mockito:mockito-all:1.9.5
+--- com.google.dexmaker:dexmaker:1.0
+--- com.google.dexmaker:dexmaker-mockito:1.0
+--- com.pusher:pusher-java-client:0.3.1
\--- com.github.tony19:logback-android-classic:1.1.1-3
     +--- com.github.tony19:apktool-lib:1.4.4-3
     |    \--- com.google.android:android:2.1_r1
     |         +--- commons-logging:commons-logging:1.1.1
     |         +--- org.apache.httpcomponents:httpclient:4.0.1
     |         |    +--- org.apache.httpcomponents:httpcore:4.0.1
     |         |    +--- commons-logging:commons-logging:1.1.1
     |         |    \--- commons-codec:commons-codec:1.3
     |         +--- org.khronos:opengl-api:gl1.1-android-2.1_r1
     |         +--- xerces:xmlParserAPIs:2.6.2
     |         \--- xpp3:xpp3:1.1.4c
     \--- com.github.tony19:logback-android-core:1.1.1-3

更新 2:

我已经将冲突缩小到logback-android-Classic库和一个本地jar(不幸的是,由于许可问题,我不能直接编辑这个jar)。排除其中任何一个都可以解决冲突,只有这两个依赖项的空通用测试应用程序将产生冲突。我已经验证了本地jar包含org.slf4j,但由于上述许可问题,我对此无能为力。所以我唯一的选择是从logback-android-Classic中排除slf4j。鉴于依赖树实际上并没有将slf4j显示为logback-android-Classic的依赖项,并且考虑到添加

    compile('com.github.tony19:logback-android-classic:1.1.1-3') {
            exclude group: 'org.slf4j'
    }

尚未解决问题,如何从日志中排除 slf4j 依赖项?

最终更新:通过与本地jar的所有者合作,最终解决了这个问题,我使用这个jar来删除日志。我怀疑这对于未来的访问者来说是一个特别有用的答案,但为了完成,我想将其包括在内。

共有1个答案

史承福
2023-03-14

我在“build.gradle”中添加了以下内容,以消除“slf4j”的传递依赖问题。这是排除依赖的方法,这样就不会以传递方式加载。并通过在“编译组”语句中提及它来显式加载冲突的库。我想这可能会对您有所帮助。

configurations {
    all*.exclude group: 'ch.qos.logback'
    all*.exclude group: 'org.slf4j', module: 'jcl-over-slf4j'
    all*.exclude group: 'org.slf4j', module: 'jul-to-slf4j'
    all*.exclude group: 'org.slf4j', module: 'log4j-over-slf4j'
    all*.exclude group: 'org.slf4j', module: 'jcl-over-slf4j'
    all*.exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    all*.exclude group: 'org.slf4j', module: 'slf4j-simple'
}

compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: log4j2Version
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: log4j2Version
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: slf4jToLog4jVersion
 类似资料:
  • 我们正在使用Gradle运行一个spring-boot应用程序。 已经通过添加以下内容进行了尝试: 这不起作用。 还增加:

  • 给予 这在gradle 1.3中无法正常工作。(即,子项目包含所有依赖项) 这是一个bug还是有不同的语法来排除项目依赖关系?

  • 我刚刚将我的项目升级到gradle 7,并且遇到了缺失的可传递依赖项。我试着改变我的身材。gradle文件在依赖项中使用“api”,但这并没有修复它。 projectA依赖于projectB,projectB依赖于projectC。 projectA-build。格拉德尔 projectB-构建。格拉德尔 ProjectA编译良好,但有运行时错误-从project ectC获取类的ClassNot

  • 我试图用JUnit和SLF4J测试来测试记录器的行为,这是“SLF4J的一个测试实现,它将日志消息存储在内存中,并提供检索它们的方法”。 我有一些将SLF4J作为传递依赖项的依赖项。我试图将SLF4J从我的测试配置中的所有依赖项中排除,但我仍然需要它来进行SLF4J测试。 我可以通过下面的代码将SLF4J排除在所有内容之外,但这显然也将它排除在我需要的SLF4J测试之外。 由于SLF4J是我的许多

  • 我想在我的项目中找到未使用的依赖项。Gradle中有没有类似Maven的功能?

  • 问题内容: 我的gradle项目使用该插件构建了一个jar文件。作为运行时传递依赖项的一部分,我最后引入。(在至少5或6个其他可传递依赖项中被称为子传递依赖项-该项目正在使用spring和hadoop,因此除了厨房水槽之外的所有东西都被拉进来了…等一下…那里也是:) )。 我想从我的内置jar中全局排除该jar。所以我尝试了这个: 但是,这似乎排除了所有 org.slf4j工件,包括slf4j-a