如何从java执行批处理文件?

我想从java程序执行批处理文件。

我使用以下命令。

Runtime.getRuntime().exec("server.bat"); 

但问题是我想给出一个reative路径而不是绝对路径,以便我可以在任何comp上部署该java项目。

该项目的目录结构如下:

 com | project | ------ parser | |_____ Main.java | -------util |_____ Server.bat 

我想从“parser”目录中的“Main.java”文件中运行“util”目录中的“Server.bat”文件。

当Java运行并且您使用带有相对路径的Runtime.exec()时,相对意味着相对于调用JVM的当前用户目录。

这可能有效

 Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat"); 

如果你从com的父目录启动java。

或者你必须计算一个绝对路径:

 Runtime.getRuntime().exec("cmd.exe", "/c", System.getProperty("user.dir")+"/com/projct/util/server.bat"); 

我忘了,读Runtime.exec()时不会 。

您可以使用ProcessBuilder 。 它提供了比exec更多的控制。 特别是,它允许使用方法directory设置工作directory

例:

 ProcessBuilder pb = new ProcessBuilder("server.bat"); pb.directory(new File(deployDir + "\\com\\project\\util")); Process p = pb.start(); int exitStatus = p.waitFor(); 

当然,您的应用必须从某个地方获得deployDir。 它可以在环境中设置,在应用程序配置文件中,可以是当前用户目录或其他任何内容。

您必须使用参数“/ c”和“server.bat”运行“cmd.exe”:

 Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" } ); 

如果支持,您可以使用Desktop进行尝试(Java 1.6)

  File file = new File("server.bat"); Desktop.getDesktop().open(file); 

Plexus utils提供了一个Commandline类型,可以调用任意命令行并处理输出的解析。

 Commandline cl = new Commandline(); cl.setExecutable( "cmd.exe" ); cl.createArg().setValue( "/c" ); cl.setWorkingDirectory( new File(System.getProperty("user.dir"), "/com/project/util/Server.bat")); cl.createArg().setValue( "/c" ); StreamConsumer consumer = new StreamConsumer() { public void consumeLine( String line ) { //do something with the line } }; StreamConsumer stderr = new StreamConsumer() { public void consumeLine( String line ) { //do something with the line } }; int exitCode; try { exitCode = CommandLineUtils.execute( cl, consumer, stderr, getLogger() ); } catch ( CommandLineException ex ) { //handle exception } 

您最好的选择是将应用程序的安装目录存储在系统上,然后使用它在应用程序中构建路径。 System.getProperty(“user.dir”)应该在Windows和Unix平台上工作以获取当前工作目录,但它依赖于系统,因此请注意这一点。

exec的第二个参数是环境设置的args的String [](null表示inheritance进程的当前值),exec的第三个参数应该是提供工作目录的文件。 尝试这个:

 Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util"));