2013-10-18 137 views
0

我在Windows上編寫的代碼工作正常無法在Mac上運行。 縮寫形式,我呼籲:如何在Mac上從Java啓動另一個應用程序

Runtime.getRuntime().exec (String ["/Applications/CM Battle for Normandy/CM Battle for Normandy.app" "2vs2 White Manor 072.ema"], null, "/Applications/CM Battle for Normandy/"); 

沒有文件關聯設置與我嘗試運行的軟件.ema文件(這是一個遊戲,如果你是好奇)

我的代碼看起來像這樣的:

private void launchGameProgram (PBEMGame selectedGame) { 
    if (selectedGame == null) 
     return; // no work to do 

    InstalledProgram program = selectedGame.playedWith(); 
    if (program == null) 
     return; // no work to do 

    try { 
     Vector<String> command = new Vector<String>(); 
     command.add (program.getExeFile().getAbsolutePath()); 
     if (selectedGame.getLastTurn() != null && selectedGame.getLastTurn().getTurnFile() != null) { 
      // Add the turn file name to the command 
      command.add (selectedGame.getLastTurn().getTurnFile().getName()); 
     } 
     GUIApplicationPolicy.getLog().log ("WTII testing: About to launch: " + command.toString() + " from: " + program.getExeFile().getParentFile()); 
     Runtime.getRuntime().exec (command.toArray (new String[command.size()]), null, program.getExeFile().getParentFile()); 
    } catch (IOException exception) { 
     GUIApplicationPolicy.getLog().log (exception); 
     exception.printStackTrace(); 
    } 
} 

這將產生日誌中的以下內容:

!Entry: 2013/10/02 23:08:33.017 
!Message: WTII testing: About to launch: [/Applications/CM Battle for Normandy/CM Battle for Normandy.app, 2vs2 White Manor 072.ema] from: /Applications/CM Battle for Normandy 

!Entry: 2013/10/02 23:08:33.023 
!Exception: Cannot run program "/Applications/CM Battle for Normandy/CM Battle for Normandy.app" (in directory "/Applications/CM Battle for Normandy"): error=13, Permission denied 
!Stack: java.io.IOException: Cannot run program "/Applications/CM Battle for Normandy/CM Battle for Normandy.app" (in directory "/Applications/CM Battle for Normandy"): error=13, Permission denied 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041) 
    at java.lang.Runtime.exec(Runtime.java:617) 
    at com.lesliesoftware.whoseturnisit.WhoseTurnIsIt.launchGameProgram(Unknown Source) 
    at com.lesliesoftware.whoseturnisit.WhoseTurnIsIt.access$3100(Unknown Source) 
    at com.lesliesoftware.whoseturnisit.WhoseTurnIsIt$LaunchSelectedGameProgram.widgetSelected(Unknown Source) 
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:3776) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1367) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1390) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1375) 
    at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1187) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3622) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3277) 
    at com.lesliesoftware.whoseturnisit.WhoseTurnIsIt.main(Unknown Source) 
Caused by: java.io.IOException: error=13, Permission denied 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022) 
    ... 14 more 

任何幫助或指導,將不勝感激。

回答

1

試試這個..

Runtime.getRuntime().exec (String ["open /Applications/CM Battle for Normandy/CM Battle for Normandy.app" "--args" "2vs2 White Manor 072.ema"], null, "/Applications/CM Battle for Normandy/") 

UPDATE:與伊恩商量後..

Runtime.getRuntime().exec (String ["open" "/Applications/CM Battle for Normandy/CM Battle for Normandy.app" "--args" "2vs2 White Manor 072.ema"], null, "/Applications/CM Battle for Normandy/") 
+0

有趣的是,在這種情況下open有什麼作用? –

+0

@IanLeslie - 'open'是執行應用程序的Mac命令。嘗試'打開/應用程序/ CM戰鬥諾曼底/ CM爭奪諾曼底.app --args 2vs2'白色莊園072.ema'從'終端'確認。 – vidit

+0

此外,我編輯了我的答案,在其中添加'--args',這是將參數傳遞給應用程序所必需的。 – vidit

0

你正在嘗試執行「CM Battle for Normandy.app」,這是一個文件夾(是的,我知道可能誤導.app擴展名)。你想要做的是在該文件夾中找到一個二進制文件,然後執行。通常在該文件夾中有一個內容文件夾,並在其中有一個MacOS文件夾,並且該文件夾中應該有一個可執行文件(可能是「CM諾曼底戰役」)。

您可以通過您的終端或Finder找到它。

所以我quess是改變:

"/Applications/CM Battle for Normandy/CM Battle for Normandy.app" 

"/Applications/CM Battle for Normandy/CM Battle for Normandy.app/Contents/MacOS/CM Battle for Normandy" 

但它可能會略有不同。它沒有像Windows那樣的擴展(即.exe或smth),但這是因爲MacOS是一個Unix類型的系統。

+0

確定了一些進展。然而,該應用程序沒有正確啓動 - 它嘗試但失敗 - 我認爲它找不到它所依賴的一些庫。我不確定,因爲我沒有從這個日誌中得到日誌。在Windows上,如果我嘗試使用不正確的「目錄開始」啓動遊戲,我看到類似的結果。我會試着告訴它從.app目錄開始,看看我能得到什麼。正如你可能會告訴我沒有Mac,所以我通過一個有用的用戶來做這件事。但這是非常緩慢的。 –

+0

我不認爲你可以做到這一點。你需要使用osx的「open」命令 - 它知道如何正確查看.app /文件夾。我不認爲osx希望任何人在裏面尋找並尋找二進制文件來運行... – GreenAsJade

0

是在命令行中運行這個東西?我看到一個命令變量,但是我沒有看到任何關於它究竟是什麼的情況。你可能需要爲任何命令添加一個'sudo'前綴(假設它在終端中)。我只是從權限錯誤推斷出來的。

另外,我看到一個'getExeFile'。也許我誤解了這一點,但爲什麼你會在MacOS上尋找一個.exe文件?再次,我可能只是誤解了這段代碼。無論如何,我希望這可以幫助你,或者至少可以幫助你慢跑你的大腦。

+0

不知道如何回答「是從命令行運行」。我沒有命令行,但我試圖啓動另一個應用程序,在Windows上,這些參數將與命令行窗口中使用的相同。 –

+0

getExeFile是我爲最初寫在Windows上的私人類編寫的一種方法。我從來沒有想到,在Mac上,可執行文件(缺少更好的單詞)將是目錄而不是文件。所以這個名字只是一個工件,實際返回的File對象是windows上的xxx.exe和mac上的xxx.app。 –

+0

@IanLeslie「可執行的東西」是一個二進制文件,並且有Mac上的應用程序的二進制文件,因爲我在回答中發佈了 –

相關問題