2010-07-21 84 views
2

我已经处理了在Java中启动另一个VM。 请参阅ProcessBuilder - Start another process/JVM - HowTo?ProcessBuilder - 在Scala中启动另一个进程/ 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") 
    } 
} 

我试图定义的对象和类为主。都在同一个.scala文件中或在一个单独的文件中。

我在做什么错?

+0

您应该详细说明在您编写代码后您做了什么:您使用了哪些工具/命令?结果是什么? – 2010-07-21 13:04:40

+0

细节与我的java问题相同。 class O3 def main(args:Array [String]){ println(“O3”) } } – 2010-07-21 13:42:23

回答

4

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

如果剥离该后缀,则从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") 
    } 
} 
+0

这听起来很合理,但它对我不起作用。复制你的代码在我的Eclipse项目ScalaTest结果默认套餐: className1 = O3 className2 = package1.O4 开始 的ProcessBuilder = [Z:\科登\ java的\ jre6x64 \ BIN \ java中,-cp,Z: \ Coden \ WS-Scala-2.8 \ ScalaTest \ bin,O3] – 2010-07-22 16:40:56

+0

@Stefan K,我在IntelliJ 9.0.2上测试了上面的脚本,并得到了“来自O3的hello”和“来自O4的hello”。两个waitFor调用返回0.对于在类名中恢复的$ suffix运行,我从流中获得null,null,waitFor调用返回1,1.这可能是一个环境问题,也许您可​​以将“echo”添加为ProcessBuilder构造函数调用的第一个参数,看看输出是什么,并可能复制并粘贴到shell中? – 2010-07-22 17:17:27

+0

用java,eclipse没有问题,这让我感到困惑。以下是ProcessBuilder的所有构造函数参数的输出: Path:Z:\ Coden \ java \ jre6x64 \ bin \ java ClassP:Z:\ Coden \ WS-Scala-2.8 \ ScalaTest \ bin className:O3 感谢您的忍耐。 – 2010-07-23 11:54:54

相关问题