我想从java程序执行批处理文件。
我正在使用以下命令。
Runtime.getRuntime().exec("server.bat");
但问题是我想提供一个reative路径而不是绝对路径,以便我可以在任何comp上部署该java项目。
项目的目标结构如下:
com
|
project
|
------ parser
| |_____ Main.java
|
-------util
|_____ Server.bat
我想从“parser”目录中的“Main.java”文件中运行“util”目录中的“Server.bat”文件。
答案 0 :(得分:8)
您可以使用ProcessBuilder
。它提供了比exec
更多的控制。特别是,它允许使用方法directory
设置工作目录。
示例:
ProcessBuilder pb = new ProcessBuilder("server.bat");
pb.directory(new File(deployDir + "\\com\\project\\util"));
Process p = pb.start();
int exitStatus = p.waitFor();
当然,你的应用必须从某个地方获得deployDir。它可以在环境中设置,在应用程序配置文件中,可以是当前用户目录或其他任何内容。
答案 1 :(得分:6)
您必须使用参数“/ c”和“server.bat”运行“cmd.exe”:
Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" } );
答案 2 :(得分:5)
当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");
我忘记了,请阅读When Runtime.exec() won't。
答案 3 :(得分:4)
如果支持,您可以使用Desktop(Java 1.6)
File file = new File("server.bat");
Desktop.getDesktop().open(file);
答案 4 :(得分:0)
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
}
答案 5 :(得分:0)
最好的办法是将应用程序的安装目录存储在系统中,然后使用它在应用程序中构建路径。 System.getProperty(“user.dir”)应该可以在Windows和Unix平台上运行以获取当前的工作目录,但它依赖于系统,所以要注意这一点。
答案 6 :(得分:0)
exec的第二个参数是环境设置的args的String [](null表示继承进程的当前值),exec的第三个参数应该是提供工作目录的文件。试试这个:
Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util"));