我试图从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)
答案 0 :(得分:2)
我认为问题是没有名为fan
的Windows文件,只有fan.bat
!
只有Windows命令提示符才会插入fan
并查找可执行扩展名.com
,.bat
,.cmd
,.exe
等。
注意使用BedSheet代理的经验告诉我,新的fan.bat
在单独的进程中启动Java,批处理文件立即完成;因此即使Fantom程序成功运行,您也不会从Process
类接收任何输出。
相反,您需要编写一个自己启动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
。