从我的应用程序中我必须执行一个我没有源代码的外部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,而不是。我们在这里。 :)
答案 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支持执行此操作的参数。