【发布时间】:2016-10-08 13:53:51
【问题描述】:
源代码
问题描述
我正在使用 .jar 库的那个库中编写 Android 库 (.aar)。
为了避免依赖重复,我使用ShadowJar插件重新打包,如下图:
task shadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
System.out.println("Relocating packages...")
relocate 'retrofit' , 'com.codecraft.retrofit'
relocate 'org.simpleframework.xml', 'com.codecraft.org.simpleframework.xml'
relocate 'com.squareup.okhttp' , 'com.codecraft.com.squareup.okhttp'
}
在使用 Android 库 (.aar) 的应用程序中,我有以下所示库的依赖项,只是为了测试我没有依赖项重复问题。
dependencies {
compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
compile 'com.squareup.retrofit:converter-simplexml:2.0.0-beta1'
}
但是当我尝试在 Android 上运行应用程序时出现以下错误
错误:警告:忽略匿名内部的 InnerClasses 属性 类错误:(com.bea.xml.stream.util.CircularQueue$1) 带有一个错误:关联的 EnclosureMethod 属性。这节课 可能是由没有针对 现代 .class 文件格式。推荐的错误:解决方案是 使用最新的编译器从源代码重新编译类 错误:并且没有指定任何“-target”类型选项。这 忽略错误的后果:这个警告是反光的 对这个类的操作会出错 Error:indicate that it is 不是内部类。错误:处理“javax/xml/XMLConstants.class”时出现问题:错误:不建议或错误使用 核心类(java.* 或 javax.*)错误:不构建核心时 图书馆。错误:这通常是由于无意中包含了一个核心 库文件错误:在应用程序的项目中,使用 IDE 时 (例如错误:Eclipse)。如果你确定你不是故意的 定义一个 Error:core 类,那么这是最可能的解释 什么是错误:继续。错误:但是,您实际上可能正在尝试 在核心 Error:namespace 中定义一个类,你的来源 例如,可能已获取错误:来自非 Android 虚拟机 项目。这将最错误:肯定行不通。至少,它 危害错误:您的应用与未来版本的兼容性 平台的。错误:它的合法性也经常受到质疑。 错误:如果你真的打算建立一个核心库——这只是 错误:适合作为创建完整虚拟机的一部分 错误:分发,而不是编译应用程序——然后使用 错误:“--core-library”选项禁止显示此错误消息。 错误:如果你继续使用“--core-library”但实际上是 错误:构建应用程序,然后预先警告您的 应用程序错误:在某些时候仍然无法构建或运行。 请错误:为那些发现的愤怒客户做好准备,例如, 你的错误:应用程序一旦升级它们就停止运行 操作错误:系统。你会为这个问题负责。 错误:如果您合法地使用了一些恰好位于 错误:核心包,那么您拥有的最简单安全的替代方案是 错误:重新打包该代码。也就是说,将有问题的类移动到 错误:您自己的包命名空间。这意味着他们永远不会 错误:与核心系统类冲突。 JarJar 是一个工具,可以 帮助错误:你在这个努力。如果你发现你无法做到这一点, 然后错误:这表明您所在的路径将 最终错误:导致痛苦、痛苦、悲伤和悲叹。 错误:1个错误;中止 :app:transformClassesWithDexForDebug 失败 错误:任务执行失败 ':app:transformClassesWithDexForDebug'.
com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException
请注意,如果我只添加改造依赖项,则此问题不会出现
dependencies {
compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
}
是什么原因以及如何解决这个错误?
【问题讨论】:
-
很确定您可以通过使用
provided file("your.jar")而不是使用compile来解决这个问题。 -
@JaredRummler 这没有帮助,我仍然有同样的问题,也许你可以下载我的项目并检查自己,也许我做错了什么? :(
-
不要将这些 jars 打包到你的库中(这会导致在使用的应用程序中出现重复),最好不要打包它们,而是告诉 Gradle 将提供它们。为此,在构建 aar 的应用程序中,将依赖项的所有“编译”关键字替换为“提供”。然后,所有使用您的库的应用程序还需要将这些依赖项添加为“编译”依赖项。 (提供的基本是说:它是一个运行时依赖,不要打包到我的app中)
-
@jmols 我的解决方案背后的想法是,使用我的库的其他应用程序必须不关心任何事情,他们只需要包含我的 aar 并使用它的功能,并且还能够包含相同的库或依赖项并且没有冲突。这就是为什么我想重命名包以避免任何冲突。
-
缺点是你的库会变得更大(方法数量),你将负责升级所有依赖项,并且你对其他人隐藏你的依赖项。并行运行同一个库的多个版本也会产生严重的副作用,并且会增加内存和线程占用。我强烈建议不要自己管理这个,而是依靠 Gradle。此外,添加额外的 Gradle 依赖项对每个人来说都应该很简单,不是吗?