2013-04-20 126 views
0

有關我的項目的一些原因,我需要一個Java EE服務器上運行此命令「的gcc -o file.c的file.exe」,我用這個java代碼在Java EE服務器Exec的運行

try { 
     Runtime runtime = Runtime.getRuntime(); 
     String[] cmd={"cmd.exe","/C gcc " + a +".c" + " -o "+b}; 
     Process p = runtime.exec(cmd,null,null); 
     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
      String line = null; 
      try { 
       while((line = reader.readLine()) != null) { 
         System.out.println(line); 
       } 
      } finally { 
       reader.close(); 
      } 
     } catch(IOException ioe) { 
      ioe.printStackTrace(); 

     } 


     } 
    catch (Exception e) {System.out.println("erreur d'execution"); } 

} 

該命令在cmd上完美工作,此代碼在Java應用程序中完美工作,並獲得我的輸出(.exe)和我的錯誤。

一旦我嘗試稍後(使用JBoss服務器)將其部署到服務器上,則什麼也沒有發生。我稍後嘗試從服務器執行cmd,也沒有發生任何事情。所以這是一種Java EE服務器問題。

我該如何解決?是否有其他服務器,如Tomcat可以執行此代碼?

+0

什麼是你的服務器的操作系統?執行Tomcat/JBoss或其他Web應用程序服務器的用戶是否有足夠的權限執行其他程序? – 2013-04-20 12:50:55

+1

更改'System.out.println(「erreur d'execution」);'更有用的'e.printStackTrace(); System.out.println(「erreur d'execution」);' – 2013-04-20 12:55:47

+0

我使用windows7和eclipse juno來運行我的服務器,我的用戶是一個使用JNDI連接服務器的java應用程序,起初我使用EJB3代碼但看起來EJB並沒有處理文件系統和IO.File的使用,因此我在切換到spring時處理它,所以我留下了使用此代碼在服務器上執行cmd的問題!那將是什麼條件? – Hobbit1919 2013-04-20 13:01:08

回答

0

首先,出於多種原因,使用runtime.exe的產卵過程違反了EJB規範。因此,如果你不明白這樣做的意義,你就可以一手拿槍,而另一手拿子彈。

您可以將此代碼移動到Servlet中(仍然部署到您選擇的JavaEE容器中)以符合規範,但您仍然需要了解如果您的應用程序運行在集羣環境中,它將如何全部發揮出來這樣。如果您需要進程在數據庫事務的範圍內進行交互,那麼您遇到的問題更多,但是讓我們假設這不是您的要求之一。

由於這些警告的出路,您目前的方法存在一個主要缺陷,將導致無區別的線程死鎖。當你啓動一個進程時,你必須在他們自己的線程中管理STDOUT/STDERR流,這樣緩衝區將會排空,而不會在兩者之間產生死鎖。你在這裏沒有這樣做,你只是從你從開始你的過程的同一個線程讀取InputStream。當你說 - '沒有任何反應'時,這很可能是這裏發生的事情。你採取了服務器進程的線程轉儲嗎?

爲了避免這種死鎖,他們會在某個時候發生信任我,用這樣的模式被這裏概述:Why runtime.exec() hangs