我正在使用 scala 和 maven (maven-shade-plugin) 制作一个 uber-jar(即内部包含 scala-runtime 类)。我需要它在类路径上运行(使用 scala 控制台)和不使用 scala 运行时库(作为独立的 jar)。所以我做了以下事情:
- 使用 maven-shade-plugin 将着色类升级为 scala_2_12_8(即 scala 运行时位于 scala_2_12_8 包中)
- 运行 scala 2.12.8 控制台
- 使用 require my.jar (my_2.12-2.1.3-SNAPSHOT.jar) 加载了我的 jar 当我尝试使用 new org.test.MyObject 创建对象时,出现以下异常:
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)
error: error while loading package, class file '/home/cergey/Documents/my_2.12-2.1.3-SNAPSHOT.jar(scala_2_12_8/package.class)' is broken
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)
error: error while loading MyObject, class file '/home/cergey/Documents/my_2.12-2.1.3-SNAPSHOT.jar(org/test/MyObject.class)' is broken
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)
<console>:12: error: my.MyObject does not have a constructor
new test.MyObject
Scala 控制台版本和 jar 中的版本匹配。 当我在没有 scala 运行时类的情况下运行时,一切正常。 有人可以指出发生了什么,即为什么 jvm 在非 scala 类上寻找 Scala 注释吗?
最佳答案
经过两个小时的调试,我得到了最明显的启示:我们的带有阴影scala库的阴影jar有一个重命名的ScalaSignature包(即scala_2_11.reflect.ScalaSignature),但是scala编译器(由spark启动)在解析类时期望它是scala.reflect.ScalaSignature。解决方案不是将 scala 库与应用程序捆绑在一起。我还发现了这个question on SO .
关于java - 从 scala 控制台启动 scala uber-jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57285485/