scala - ProcessBuilder - 在 Scala 中启动另一个进程/JAVA - 如何?

标签 scala process jvm fork scala-2.8

我已经用 Java 启动了另一个虚拟机。 请参阅ProcessBuilder - Start another process / JVM - HowTo?

出于某种原因,我无法在 Scala 中做同样的事情。 这是我的代码

object NewProcTest {
  def main(args :Array[String]) {
    println("Main")
//    val clazz = classOf[O3]
    val clazz = O4.getClass
    Proc.spawn(clazz, true)
    println("fin")
  }
}

object Proc{
  def spawn(clazz :Class[_],  redirectStream :Boolean)  {
    val separator = System.getProperty("file.separator")
    val classpath = System.getProperty("java.class.path")
    val path = System.getProperty("java.home") + 
      separator + "bin" + separator + "java"
    val processBuilder = 
            new ProcessBuilder(path, "-cp", 
            classpath, 
            clazz.getCanonicalName())
    processBuilder.redirectErrorStream(redirectStream)
    val process = processBuilder.start()
    process.waitFor()
    System.out.println("Fin")
  }
}

我尝试在对象和类中定义 main 。两者都在同一个 .scala 文件中或在单独的文件中。

我做错了什么?

最佳答案

问题似乎是对象的类名有“$”后缀。

如果去掉该后缀,则从 ProcessBuilder 触发的 Java 调用行将起作用。

我在下面修改了一些内容来展示一些测试用例。我还不确定为什么会出现这种情况,但至少它提供了一种解决方法。

import java.io.{InputStreamReader, BufferedReader}
import System.{getProperty => Prop}

object O3 {def main(args: Array[String]) {println("hello from O3")}}

package package1 {
  object O4 {def main(args: Array[String]) {println("hello from O4")}}
}

object NewProcTest {
  val className1 = O3.getClass().getCanonicalName().dropRight(1)
  val className2 = package1.O4.getClass().getCanonicalName().dropRight(1)
  val sep        = Prop("file.separator")
  val classpath  = Prop("java.class.path")
  val path       = Prop("java.home")+sep+"bin"+sep+"java"

  println("className1 = " + className1)
  println("className2 = " + className2)

  def spawn(className:      String,
            redirectStream: Boolean) {
    val processBuilder = new ProcessBuilder(path, "-cp", classpath, className)
    val pbcmd          = processBuilder.command().toString()

    println("processBuilder = " + pbcmd)

    processBuilder.redirectErrorStream(redirectStream)

    val process = processBuilder.start()
    val reader  = new BufferedReader(new InputStreamReader(process.getInputStream()))

    println(reader.readLine())
    reader.close()
    process.waitFor()
  }

  def main(args :Array[String]) {
    println("start")
    spawn(className1, false)
    spawn(className2, false)
    println("end")
  }
}

关于scala - ProcessBuilder - 在 Scala 中启动另一个进程/JAVA - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3299438/

相关文章:

scala - 来自 Java 的事物 list ,我们现在将在 Scala 之后愉快地告别

scala - 将列表[任务[列表[A]]]转换为任务[列表[A]]

Bash - 如何杀死符合条件的当前用户的所有进程?

c# - Process.Start ("IEXPLORE.EXE") 在启动后立即触发 Exited 事件。为什么?

java - 在有限的时间内暂停 JVM

scala - 覆盖 sbt 中的默认编译任务

scala - 如何在非对称系统中将对象发送到远程 akka actor

c - 僵尸进程

java - 类 java.nio.file.Files 抛出 FileAlreadyExistsException 作为 "optional specific exception"。这是什么意思?

java - 是什么导致了 JVMTI_ERROR_NULL_POINTER?