2011-11-01 74 views
2

MVN我創造了使用的ProcessBuilder其創建過程,然後啓動過程中的一類運行使用的ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("mvn","exec:java","-Dexec.mainClass="+"FunnyClass"); 

現在,當我米運行在Linux上盒這個類,它運行正常,但在Windows它給我的錯誤,說明像未找到「MVN」,我需要改變,以

ProcessBuilder pb = new ProcessBuilder 
         ("mvn.bat","exec:java","-Dexec.mainClass="+"FunnyClass"); 

但是,如果我在命令提示符下運行命令「MVN EXEC:JAVA -Dexec.mainClass = FunnyClass」,它運行正常。那麼爲什麼我需要在processbuilder中給mvn.bat。

有沒有解決方法?

我的java應用程序將在兩個窗口上運行& linux盒子,那我該怎麼辦?

回答

3

發生這種情況是因爲Windows外殼程序(cmd)具有以下功能:它會嘗試向您正在運行的命令行添加擴展名exe,'bat','cmd'。一旦找到第一個匹配(即文件系統中真正存在的文件),它就會運行它。

在maven的情況下,你有unix shell腳本mvn不能在windows和windows批處理文件'.bat'上執行。命令提示符將'.bat'添加到您在命令提示符下鍵入的'mvn',看到該文件存在並運行它。

當你從java運行進程時你沒有shell,所以沒有人做這個工作。我建議你檢查操作系統,並保持每個操作系統的命令。如果你想澄清的溶液創建資源文件cmd.properties:

mvn.windows = mvn.bat 
mvn.unix = mvn 

使用系統屬性os.name現在檢查OS和cmd.properties創建使用命令數據。

另一種解決方法是在windows上使用cmd /c運行命令,在unix上使用'/ bin/sh -c',但它不會簡化任何操作,所以我會避免這種情況。

+1

謝謝,我想通過System.getProperty(「os.name」)來檢查操作系統。我不知道當你從java運行進程時,你沒有shel。感謝幫助。 – Aniruddha