通过给出脚本位置的相对路径从Java调用shell脚本

时间:2015-04-10 16:20:18

标签: java web-applications

我正在开发一个项目,我必须将我的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我不能直接附加它们。

1 个答案:

答案 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(为了确保您使用“正确的”类加载器,即加载您的类的那个)