java - 从 scala 控制台启动 scala uber-jar

标签 java scala maven uberjar

我正在使用 scala 和 maven (maven-shade-plugin) 制作一个 uber-jar(即内部包含 scala-runtime 类)。我需要它在类路径上运行(使用 scala 控制台)和不使用 scala 运行时库(作为独立的 jar)。所以我做了以下事情:

  1. 使用 maven-shade-plugin 将着色类升级为 scala_2_12_8(即 scala 运行时位于 scala_2_12_8 包中)
  2. 运行 scala 2.12.8 控制台
  3. 使用 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/

相关文章:

scala - Cake Pattern 可以用于非单例样式的依赖吗?

maven - 在私有(private) BitBucket 存储库上部署 AAR

java - 使用 maven 插件的离线 swagger 文档

java - 无法使用 Java WebStart 在 JNLP 中启动 spring boot

scala - saveAsNewAPIHadoopFile() 在用作输出格式时出错

java - Action 监听器不适用于鼠标点击

scala - 在 akka-http 中使用handleWebsocketMessage

java - 记录 Maven 依赖关系

java - 对数组进行排序,但按排序顺序更改其对应数组的列表

java - 使用 JSONObject 在 Java 中为以下结构创建嵌套 JSON 对象