2010-07-21 26 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

相關問題