2011-10-31 72 views
4

這類問題是竊聽我已經有一段可執行文件(.exe),所以我很好奇你的方法是如何處理以下情況:適當的方式執行在不同情況下

想象我有同一個工作空間中的兩個不同的eclipse項目稱爲ProjectA和ProjectB。項目B包含其根,它是從項目A稱爲以下方式中的.EXE文件:

Process p = Runtime.getRuntime().exec("../ProjectB/ProjectB.exe"); 

現在的問題是,該部署後的結構稍有變化:項目A現在是一個.jar。該jar旁邊現在是一個ProjectB文件夾,其中包含ProjectB及其.exe,.jars等。現在正確的調用將不得不如下所示:

Process p = Runtime.getRuntime().exec("ProjectB/ProjectB.exe"); 

因爲我需要這些結構保持像他們的,我不希望我的,因爲我試過幾件事情給每個應用程序的情況下,在兩個不同的.exec電話解決這種情況:

1)添加項目B作爲ClassFolder到項目A和讓ContextClassLoader搞清楚,在哪裏可以找到ProjectB.exe這樣的:

URL url= Thread.currentThread().getContextClassLoader().getResource("ProjectB.exe"); 
file = new File(url.toURI()); 
Process p = Runtime.getRuntime().exec(file.getAbsolutePath()); 

該解決方案的工作完全正常,直到我試圖部署我的申請在網絡驅動器上。

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI has an authority component 
    at java.io.File.<init>(Unknown Source) 

2)因爲我不會像被允許爲每個客戶端的網絡驅動器,我試圖解決這個問題,並做了以下內容:

URL url= Thread.currentThread().getContextClassLoader().getResource("ProjectB.exe"); 
File file = new File(url.getFile()); 
Process p = Runtime.getRuntime().exec(file.getAbsolutePath()); 

這似乎promissing,但不幸的是只要我的路徑沒有破折號(「」),因爲這個appraoch似乎將每一個破折號轉換成運行時間執行器看起來並不喜歡的「%20」。當然,我可以在之後將所有「%20」替換爲「」,但這對我來說似乎有點不好。

另一個要求是,這兩個應用程序必須在不同的JVM中運行,這就是爲什麼我通過運行時執行調用.exe文件的原因。所以我的最後一個問題是:有什麼方法可以在沒有任何解決方法的情況下讓ProjectB調用變得乾淨?

回答

1

乾淨的方法是定義一個搜索路徑(幾個指向不同目錄的File實例)。附加exe的名稱到每個路徑,並檢查是否存在結果File並使用該路徑來執行它。

例外來自Windows的安全層:它不允許從網絡路徑運行未知的exe文件。查看您的系統管理員以獲取解決方案。

請注意,您不能始終從類路徑中加載exe。例如,如果它們在JAR中,它將不起作用。 Windows'啓動程序不知道如何處理JAR文件。這裏的解決方案是將資源解壓縮到臨時文件並從那裏啓動。

+0

感謝您抽出時間來解決我的問題。使用搜索路徑的想法很有趣。我仍然不喜歡,我首先必須確定.exe文件的真實位置,但它仍然是一個簡單而令人滿意的解決方案。我不知道我爲什麼沒有自己想出來。 – crusam

相關問題