有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从scala控制台启动scala uberjar

我正在使用scala和maven(maven shade插件)制作一个uber jar(即内部包含scala运行时类)。我需要它在类路径上运行(使用scala控制台),而不使用scala运行库(作为独立的jar)。因此,我做了以下工作:

  1. 使用maven shade插件将类着色到scala到scala_2_12_8(即scala运行时放在scala_2_12_8包中)
  2. 运行scala 2.12.8控制台
  3. 使用require加载我的jar。jar(my_2.12-2.1.3-SNAPSHOT.jar) 当我尝试创建时,使用新组织创建一个对象。测验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注释吗


共 (1) 个答案

  1. # 1 楼答案

    经过两个小时的调试,我得到了最明显的启示:我们的带有着色scala库的着色jar有一个重命名的ScalaSignature包(即scala_2_11.reflect.ScalaSignature),但在解析类时,scala编译器(由spark启动)希望它是scala。反映鳞片签名。解决方案不是将scala库与应用程序捆绑在一起。我还发现了这个question on SO