我遇到了编译错误:
[warn] Class com.google.api.client.auth.oauth2.Credential not found - continuing with a stub.
[error] error while loading GoogleService, class file '....../gdata-core-1.0.jar(com/google/gdata/client/GoogleService.class)' is broken
发现了这个类似的问题,但无法成功地将其解决方案用于我的情况。如何根据 Scala 编译器跟踪这个罐子中实际损坏的内容(即获取实际损坏的详细信息(,以确保解决方案是什么?
我认为这个谷歌罐子构建的来源就在这里。
注意:与其他问题不同,就我而言,根据这些谷歌设置说明,谷歌 jar 包含在我的项目中,在 lib
目录中不受管理。
如链接答案中所述,当类包含类路径上不再存在的一些注释时,会发生此错误。Java认为这是可以接受的,但Scala不这么认为。通常,只有在经过高度优化的 Java 库中,您才会遇到此问题,其中它们故意排除了"不必要的"注释。谷歌对他们的很多代码都这样做;老实说,我认为我从未在任何非谷歌库中看到过这个问题。
实用的解决方案是在 maven central 上使用高级搜索来查找包含缺失类的 jar。如果 gdata-core 是用 maven 构建的(就像现在大多数严肃的 Java 库一样(,从pom.xml
的<dependencies>
部分很容易看出哪些依赖项被声明optional
,从而找出任何此类类路径问题可能在哪里。不幸的是,这个特定的库仍然是用 ant 构建的,所以如果不阅读整个build.xml
并"手动"弄清楚它,就很难确定构建类路径。
必须找到一个谷歌提供的 jar 文件,其中包含警告中提到的类(类 Credential
(,并将其粘贴在 sbt 使用的lib
目录中。
通过非常多的启发式方法,结果证明是我在这里获得的 jar 文件google-oauth-client-1.18.0-rc.jar
,同样存在于这里,在确定错误所针对的源文件之后,根本没有定义该类本身,而是从不同的包com.google.api.client.auth.oauth2
导入它。我猜后一个包在编译时一定存在,它的编译类对于 Scala 能够使用前一个 jar 中包含的类是必要的,至少在涉及 Scala 时是这样。
不确定谷歌的构建系统是如何产生这一切的,以及如何确定制作Scala所需的额外jar的注释,但是Scala不再缺少的类。
希望有人能插话提供更深层次的答案,关于如何确定一个类被破坏的细节,以及如何追溯到哪里获得它,而没有我的启发式搜索。