2013-04-20 106 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