【发布时间】:2013-12-19 18:33:06
【问题描述】:
我遇到了 Scala 和 Java 互操作性问题,Google 和 SO 似乎对此无济于事(我看到过类似的问题,但没有一个问题可以为我的案例提供有效的解决方案)。
我在 Java 中创建了一个 jar 文件(托管 here,如果您需要它来回答这个问题),其中包含一个带有静态方法的类。但是,我似乎无法从 Scala 访问这个静态方法。代码如下:
val graph1 = ...
val graph2 = ...
val union = DirectedGraph.merge(graph1, graph2)
该方法存在,我可以使用普通的 Java 代码访问它。事实上,以下工作:
DirectedGraph<OWLClass> graph1 = ...;
DirectedGraph<OWLClass> graph2 = ...;
DirectedGraph<OWLClass> union = DirectedGraph.merge(graph1, graph2);
我检查过 java 和 scala 使用的 jar 文件是否相同。我还检查了javap 是否确实存在该方法。
有什么想法可以理解并可能解决这个问题吗?
【问题讨论】:
-
它会抛出两个错误:
error while loading DirectedGraph, class file 'fetchers.jar(pt/remoteowl/objects/DirectedGraph.class)' is broken (class scala.MatchError/class DirectedGraph (of class scala.reflect.internal.Symbols$ClassSymbol))和value merge is not a member of object pt.remoteowl.objects.DirectedGraph -
了解您使用的确切 Scala 版本会很有帮助,因为“类文件 X 已损坏”在不同版本中有各种原因。
-
Scala 版本 2.10.1(OpenJDK 64 位服务器虚拟机,Java 1.7.0_25)
-
你提供的jar不是自带的;如果我尝试在 Scala repl 中使用它,我会收到“警告:找不到类 pt.remoteowl.jar.Dependency - 继续使用存根”。你确定这不是根本原因吗?除非您提供所有需要的依赖项,否则我无法尝试在我自己的机器上重现此内容。
-
问题确实是 .class 文件从 jar 中丢失。谢谢!
标签: java scala scala-java-interop