我有一个使用OkHttp的项目。 OkHttp有as one of its dependencies个Guava库。
我想在我的应用中使用Guava库。当我在我的build.gradle
中包含OkHttp时,Android Studio会发现Guava中包含的类,并在我尝试使用它们时自动导入它们。我的代码编译得很好:
ListMultimap<Integer, Integer> result = ArrayListMultimap.create();
在运行时,应用程序崩溃:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.common.collect.ArrayListMultimap" on path:
...
Suppressed: java.lang.ClassNotFoundException: com.google.common.collect.ArrayListMultimap
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 18 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
通过将Guava明确添加到我的build.gradle
:
compile 'com.google.guava:guava:15.0'
我想知道是什么阻止我在运行时访问它。我怀疑我理解为什么(因为库可能会改变它们的依赖关系,这应该对这些库的用户透明),但是如何实现呢?依赖项是否为其依赖项获取了自己的类加载器?这是Gradle构建系统中的限制吗?如果是这种情况,为什么Android Studio / IntelliJ允许我从中导入 - 它不能告诉我在运行时无法访问它吗?