2017-04-08 47 views
0

我想通過另一個程序運行.jar文件。例如,我有一個HelloWorld.jar文件,它打開一個對話框,顯示「Hello World」。我有一個Test.jar程序。當我在Test.jar中做某些事情時(即點擊某個按鈕),它應該運行HelloWorld.jar無法執行命令:沒有這樣的文件或目錄/ Java

我現在這樣做的方式是使用ProcessBuilder運行終端命令java -jar HelloWorld.jar。不過,我得到這個錯誤:

Debug: "C:\Users\Asus\.fairplay\data\apps\Amnesia\.tmp524\.bin" exists: true 
java.io.IOException: Cannot run program "java -jar Amnesia.jar" (in directory "C:\Users\Asus\.fairplay\data\apps\Amnesia\.tmp524\.bin"): CreateProcess error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) 
    at me.darksidecode.fairplay.client.util.Utils.execute(Utils.java:74) 
    at me.darksidecode.fairplay.client.app.AppLauncher.launch0(AppLauncher.java:61) 
    at me.darksidecode.fairplay.client.app.AppLauncher.launch(AppLauncher.java:37) 
    at me.darksidecode.fairplay.client.app.AppLoader.downloadAndRun(AppLoader.java:28) 
    at me.darksidecode.fairplay.client.gui.frame.GuiLauncher.onPacketReceiving(GuiLauncher.java:165) 
    at me.darksidecode.fairplay.client.core.FairPlayClient.lambda$processPacket$1(FairPlayClient.java:120) 
    at java.lang.Thread.run(Thread.java:745) 
    Caused by: java.io.IOException: CreateProcess error=2, No such file or directory 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:137) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
    ... 7 more 

100%確保這兩個文件並存在的目錄,我甚至檢查了。正如你在這裏的錯誤中看到的那樣,還有一個調試消息證明了這一點。

我的命令執行代碼:

Utils.execute(bin.getAbsolutePath().replace(bin.getName(), ""), "java -jar " + bin.getName(), false); 

我還沒有發現任何有用的答案StackOverflow上這個問題或其他地方尚未:

public static Process execute(final String path, final String cmd, final boolean removeJavaOptions) { 
    File f = Files.getFile(path); 
    System.out.println("Debug: \"" + f.getAbsolutePath() + "\" exists: " + f.exists()); 

    try { 
     final ProcessBuilder pb = new ProcessBuilder(cmd); 

     pb.directory(Files.getFile(path)); 
     pb.redirectErrorStream(true); 

     if (removeJavaOptions) 
      pb.environment().remove("_JAVA_OPTIONS"); 
     return pb.start(); 
    } catch (final Exception ex) { 
     ex.printStackTrace(); 
     return null; 
    } 
} 

這種方法本身的使用。希望有一個解決方案來解決這個問題。

回答

3

ProcessBuilder構造函數接受List<String>或可變參數(幾個字符串),例如,

new ProcessBuilder("command", "arg1", "arg2", "arg3"); 

不是單獨將命令和參數傳遞給它,而是試圖將命令與參數一起傳遞給同一個字符串。

構建器將第一個參數解釋爲命令的名稱。因此,它認爲您正在嘗試運行一個名爲java -jar Amnesia.jar的文件。它認爲你只需要一個名字中帶有空格的可執行文件。但是,當然,操作系統找不到這樣的可執行文件。

你應該做的就是運行從命令分離參數的命令,那就是:

new ProcessBuilder("java", "-jar", "Amnesia.jar"); 

所以你需要重建你的execute方法,使得無論是cmd參數是List<String> ,數組(String[]),或者它是最後一個參數,並且是參數可變參數

相關問題