【问题标题】:Launching scala uber-jar from scala console从 scala 控制台启动 scala uber-jar
【发布时间】:2019-12-08 15:53:01
【问题描述】:

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

  1. 使用 maven-shade-plugin 将着色类从 scala 转换为 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 当我尝试使用新的 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 注释?

【问题讨论】:

  • 你看过sbt-assembly吗?
  • 是的,我尝试了另一个使用 sbt-assembly 插件的项目,结果是一样的。

标签: java scala maven uberjar


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多