2

Fantom プロセスからファン コマンドを呼び出そうとしています。これは Fantom から実行されるエラーです。コマンド ラインから正しく実行されます。問題は何だと思いますか?

class Main {
   Void main() {
       buf := Buf()

       Process() {
          command = ["fan <pod>::<type>.<method>"]
          out = buf.out 
       }.run.join

       outStr := buf.flip.readAllStr
    }   
}  

これは私が得ているエラーです:

sys::IOErr: java.io.IOException: Cannot run program "fan <pod>::<type>.<method>": 
CreateProcess error=2, The system cannot find the file specified
  java.lang.ProcessBuilder.start (Unknown)
  fan.sys.Process.run (Process.java:141)
  PDFCommandLine::Main.main (Main.fan:10)
  java.lang.reflect.Method.invoke (Unknown)
  fan.sys.Method.invoke (Method.java:559)
  fan.sys.Method$MethodFunc.callOn (Method.java:230)
  fan.sys.Method.callOn (Method.java:139)
  fanx.tools.Fan.callMain (Fan.java:185)
  fanx.tools.Fan.executeType (Fan.java:147)
  fanx.tools.Fan.execute (Fan.java:41)
  fanx.tools.Fan.run (Fan.java:308)
  fanx.tools.Fan.main (Fan.java:346)
4

1 に答える 1

2

問題は、という名前の Windows ファイルがなくfanfan.bat!

fan実行可能な拡張子、、、、などを補間して検索する.comのは.bat、Windows コマンド プロンプトだけです。.cmd.exe

BedSheetプロキシを使用した経験から、新しいものfan.batは別のプロセスで Java を起動し、バッチ ファイルはすぐに終了することがわかります。Processそのため、Fantom プログラムが正常に実行されたとしても、実際にはクラスから出力を受け取ることはありません。

代わりに、Java プロセスを起動するコマンドを自分で作成する必要があります。何かのようなもの:

C:\> java -cp %FAN_HOME%\lib\java\sys.jar fanx.tools.Fan <pod>::<type>.<method>

クロスプラットフォームの方法でそれを行う小さなスニペットを次に示します。

static Process fanProcess(Str[] cmd) {
    homeDir   := Env.cur.homeDir.normalize
    classpath := (homeDir + `lib/java/sys.jar`).osPath
    args      := ["java", "-cp", classpath, "-Dfan.home=${homeDir.osPath}", "fanx.tools.Fan"].addAll(cmd)
    return Process(args)
}

そして、次のように使用できます。

buf := Buf()
fanProcess(["<pod>::<type>.<method>", "arg1", "arg2"]) {
    out = buf.out 
}.run.join
outStr := buf.flip.readAllStr

上記はあなたのにある必要javaがあることに注意してくださいPATH

于 2016-12-12T19:32:14.367 に答える