2011-02-10 70 views
0

從我的Java項目我想在另一個線程中運行一個外部.bat文件。爲了這個目的,我用下面的方法:如何在Windows服務下正確運行java中的.bat文件?

private void posAppRunner(final String path[], final Class targetClass) { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       String line; 
       Process p = Runtime.getRuntime().exec(path); 
       BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
       input.close(); 
      } catch (IOException e) { 
       LogFactory.getLog(targetClass).warn("Error when starting a PosApplication: " + e.getMessage()); 
      } 
     } 

    }).start(); 

我運行下面的.bat文件:

call chdir %~dp0 

start java <_some_arguments> 

所以,當我這樣做是從本地的IntelliJ IDEA它的工作原理正確的 - 一個cmd過程中出現,之後一個java進程出現,之後cmd進程消失。

但是當我通過ANT下TeamCity的Windows服務運行我的Java項目採用這種方法,只是CMD過程似乎並沒有什麼後發生。必須從bat文件啓動的Java進程不會出現。它看起來像我不讀過程輸出,但我做到了!

你能expain我,如何克服這種情況?

回答

0

我認爲這個問題是在當前工作目錄。我對蝙蝠文件並不是很熟悉,也不記得是什麼%~dp0的意思。無論如何,第一次嘗試修改您的批處理文件以包含硬編碼路徑。我相信這會起作用。

在這種情況下,決定什麼是更好地爲您:發現在Java代碼中的路徑,然後把它傳遞給批處理文件,動態生成批處理文件,以便它包含所有參數硬編碼或調試腳本。例如,你可以刪除start java <_some_arguments>,並把

echo %~dp0 > c:\temp\batlog.log

這將打印到日誌文件中的參數。現在將其作爲服務運行並查看日誌文件包含的內容。可能你會立即看到問題。

+0

不幸的是,它不起作用。甚至在從批處理文件中刪除「call chdir%〜dp0」字符串之後。 – Gwen 2011-02-10 14:10:19