gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:42 26 4
gpt4 key购买 nike

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

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 的库。我的 build.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-classic 依赖项是问题所在,因为它确实依赖于 slf4j,如果我评论说我的项目构建正常。根据其他消息来源,我发现这通常可以通过排除传递依赖来解决,如下所示:

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

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

更新:按照 dmahapatro 的建议运行 dependencyInsight 寻找 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'
}

问题没有解决,如何排除logback-android-classic对slf4j的依赖?

最后更新:最终,通过与我用来从中删除 logback 的本地 jar 的所有者合作解决了这个问题。我怀疑这对 future 的访问者来说是否是一个特别有用的答案,但为了完整起见,我想将其包括在内。

最佳答案

我在“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

关于android - 如何使用 gradle 从 maven repo 中正确删除传递依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25517449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com