来自 Fantom 进程的风扇命令失败

Fan command from a Fantom process Failing

我正在尝试从 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)

我认为问题在于没有名为 fan 的 Windows 文件,只有 fan.bat!

只有Windows命令提示符插入fan并查找可执行扩展,.com.bat.cmd.exe, 等等...

注意 BedSheet 代理的经验告诉我,新的 fan.bat 在单独的进程中启动 Java 并且批处理文件会立即完成;所以你实际上并没有从 Process class 收到任何输出,即使 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 上。