运行 来自 JVM 上一个 jar 的多个 Scala 应用程序

Running multiple Scala apps from one jar on JVM

我有一个 Scala 应用程序,它通过以下命令使用 uber jar 在 JVM 上成功 运行s:java -jar myapp.jar。我需要创建一个单独但相关的 Scala 作业,它使用许多与第一个相同的 objects/functions/dependencies,使其成为保存在相同代码库和 uber jar 中的一个很好的候选者。请注意,这些 Scala 作业不使用 Spark,因此 spark2-submit 不在考虑范围之内。

问题: 我怎样才能 运行 从 JVM 上的同一个 uber jar 中分离出 2 个 Scala 作业? (我正在使用 Scala 2.11.8 和 SBT 进行 jar 组装)

其他上下文:

我已经研究过相关的 Whosebug 讨论,即 this post about specifying Java classes using java -cp myapp.jar MyClass and this post,它只提出了使用 scala -classpath myapp.jar MyClass.

的 运行Scala 等价物的解决方案

虽然 scala -classpath 解决方案可能适用于第二个链接讨论的 OP,但我会将我的代码部署到没有 scala 或 [= 可执行文件的环境中20=], 只有 java.

假设这些是我想要的 2 个 Scala 作业 运行:

// MyClass.scala
package mypackage

object MyClass {
  def main(args: Array[String]): Unit = {
    println("Hello, World!")
  }
}
// MyClass2.scala
package mypackage

object MyClass2 {
  def main(args: Array[String]): Unit = {
    println("Hello, World! This is the second job!")
  }
}

有没有办法使用 java -cp myapp.jar MyClass 运行 Scala 代码? 我试过这个并收到以下错误:

Error: Could not find or load main class MyClass

我能想到的主要替代方案是创建一个 Scala 对象作为主入口点并采用参数来确定哪个作业获得 运行。如果可能的话,我想避免使用该解决方案,但它可以让我继续使用一直运行良好的 java -jar myapp.jar

您需要为 App 实例使用完全限定名称:

java -cp myapp.jar mypackage.MyClass