我已经用 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/