从特定目录执行bash命令

时间:2014-07-24 09:05:16

标签: java bash jar execute

从我的应用程序中我必须执行一个我没有源代码的外部jar。 给定一个输入文件,它处理它,创建一个"输出"目录并在其中输入一个mxml输出文件。问题是:它在tomcat / bin中而不是在原始文件的目录中创建所述目录。

这是我迄今为止所尝试的内容。 最初

Process p = new ProcessBuilder("java -jar "+newfile.getParent()+"\\converter.jar "+newfile.getPath()+" -mxml").start();

然后,从控制台看到"输出"目录是在调用命令的目录中创建的,我试过:

String startSim[] = {"cd "+newfile.getParent()+"\\" , "java -jar converter.jar "+newfile.getName()+" -mxml"};

try {
    Runtime.getRuntime().exec(startSim).waitFor();
} catch (Exception e) {
    e.printStackTrace();
    System.out.println("Log non creato.");
}

但是有了这个,我得到了#34;文件未找到"第一条指令的异常。有谁知道如何解决这个问题?我想避免在我的tomcat / bin目录中一直到达我的输出文件。

感谢您的任何建议! 保罗

P.s:顺便说一句,在尝试所有这些之前,我尝试过简单地从库中调用我需要的方法,但是遇到了同样的问题。所以我决定执行jar,而不是。我们在这里。 :)

2 个答案:

答案 0 :(得分:0)

对此的懒惰方法可能会转到根目录并从那里下降到您的tomcat bin目录。

答案 1 :(得分:0)

您可以使用ProcessBuilder.directory()方法设置工作目录:

ProcessBuilder pb = new ProcessBuilder();
pb.directory(new File("mydirectory"));
pb.command(......);

当您使用Runtime.exec()时,这不适合您,因为cd命令是shell的功能。您可以使用此技术解决此问题,但您必须在Windows上创建平台特定命令,例如cmd /c或Linux上的/bin/sh。绝对不推荐这种方式。

但在你的具体情况下,你既没有第一个也没有第二个解决方案。实际上你正在从另一个java进程开始。为什么?您可以直接轻松调用第二个进程的main()方法。

查看META-INF/MANIFEST.mf的{​​{1}}文件。字段converter.jar包含主类的完全限定名称。我们说它是Main-Class(仅举例)。在这种情况下,您可以调用

com.converters.Main

直接来自您的代码。只需将jar添加到类路径中即可。

关于在这种情况下更改工作目录。再次检查您是否真的需要这个或者您的converter.jar支持执行此操作的参数。