2009-11-06 81 views
4

我有一個Java應用程序,我從中調用一個shell腳本。任何人都可以告訴腳本文件保存在我的應用程序中,以及在整個應用程序中訪問文件的路徑是什麼。從java應用程序調用的shell腳本的位置

即時將我的腳本保存在java包但當我嘗試通過使用路徑像com.abc.script.sh通過運行我的Java應用程序通過unix我獲取錯誤 java.io.IOException:error = 2,沒有這樣的文件或目錄

我打電話一些說法與下面的代碼

私有靜態最後字符串命令腳本文件=「com.abc.script.sh -db ABC -scm TEST_xyz -bcp融爲一體。 abc.out.txt -log/var/tmp -tab abc_ $ TABLENAME「;

Process process = Runtime.getRuntime()。exec(command);

我從unix運行應用程序。

我需要將參數傳遞給shell腳本文件。參數類似於主機名,表名......

回答

0

您可以將您的shell腳本存儲爲資源(例如,在您的jar文件中),然後執行一個shell並將腳本的內容作爲標準輸入傳輸到運行的shell 。

像這樣的東西(還沒有嘗試過):

ProcessBuilder processBuilder = new ProcessBuilder("/usr/bin/bash"); 
Process process = processBuilder.start(); 
OutputStream outputStream = process.getOutputStream(); 
InputStream resourceStream = getClass().getResourceAsStream( 
     "/path/to/my/script.sh"); 
IOUtils.copy(resourceStream, outputStream); 
+0

正確答案。當然,用很少的代碼示例它會更好:) – Jonik 2009-11-06 16:12:42

+0

好吧,我添加了一些代碼... – tangens 2009-11-06 16:15:19

+0

我在哪裏可以找到IOUtils類? – 2009-11-06 16:29:45

3

想要保留腳本文件在我的應用

你寫的,我可以interprete此類似:

  • 將文件的內容存儲到內存中
  • 將文件存儲到您的文件.jar

我想你是指第二個。

你可以將它放在你想要的每個文件夾中的jar文件中。我更喜歡一個子文件夾(不是根目錄)

首先把文件放到你的jar文件中。然後你必須將它解壓到temporary file(如果你想知道如何創建一個臨時文件,請看鏈接)。
然後從jar中的文件創建一個輸入流並將數據複製到臨時文件。

InputStream is = getClass().getResourceAsStream("/path/script.sh"); 
OutputStream os = new FileOutputStream(tempFile); 
byte[] buffer = new byte[1024]; 
int bytesRead; 
while ((bytesRead = is.read(buffer)) != -1) 
{ 
    os.write(buffer, 0, bytesRead); 
} 
buffer = null; // Clear the buffer 

然後,你必須執行你的shell

Runtime.getRuntime().exec("terminalname " + tempFile.getAbsolutePath()); 

也許你可以使用此行來執行腳本(我不認爲這將與您的工作參數):

java.awt.Desktop.getDestkop().open(tempFile); 

我希望這是你的問題的答案。

0

如果你碰巧在這個項目中使用Spring框架,一個簡單而好的選擇是將shell腳本存儲在你的類路徑的一個文件夾中並使用ClassPathResource對象來定位它。

相關問題