我正在开发一个项目,我必须将我的shell脚本调用存储在我的java文件所在的位置。我目前通过提供硬编码(绝对)路径来调用shell脚本。我想要通过提供相对路径来运行我的脚本。目前我通过Java中的代码运行我的脚本:
try {
ProcessBuilder pb2 = new ProcessBuilder("/bin/bash", "/Users/umang/Documents/script.sh", arg);
Process scriptexec = pb2.start();
scriptexec.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
这里arg是脚本运行的文件的位置。当前的实现工作正常,但问题是我必须将我的脚本存储在服务器上的某个位置。它是一个部署在apache-tomcat上的webapp服务器通过制作战争文件。最好有一个相对路径,并在生成时将脚本存储在war文件中。
尝试#1:
final File executorDirectory = new File("A/B/C/D/E/F/G/H/");
try {
ProcessBuilder pb2 = new ProcessBuilder("/bin/bash","combiner.sh",arg);
pb2.directory(executorDirectory);
Process scriptexec = pb2.start();
scriptexec.waitFor();
System.out.println("Script executed successfully");
} catch (Exception e) {
e.printStackTrace();
}
A / B / C / D / E / F / G / H /我的脚本位于应用程序顶部的位置 错误:找不到文件错误-2 JavaIOException()
尝试#2
URL loc=ClassLoader.getSystemResource("script.sh");
try {
ProcessBuilder pb2 = new ProcessBuilder("/bin/bash", "/Users/umang/Documents/script.sh", arg);
Process scriptexec = pb2.start();
scriptexec.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
错误:loc没有让我获得脚本位置的路径。在调试器工具中,我发现它变为空。
由于ClassLoader.getSystemResource返回一个URL而ProcessBuilder只接受String我不能直接附加它们。
答案 0 :(得分:0)
如果在tomcat中部署了这个,请尝试将您的脚本放在战争的WEB-INF中。现在假设你从servlet启动进程,你可以使用
ServletContext ctx = getContext();
String pathForProcessBuilder = ctx.getRealPath("/WEB-INF/script.sh");
如果您不想使用ServletContext,请尝试使用
getClass().getClassLoader().getResource("/WEB-INF/script.sh")
而不是使用ClassLoader
(为了确保您使用“正确的”类加载器,即加载您的类的那个)