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

Calling shell script from Java by giving a relative path of script location

我正在做一个项目,其中我必须调用存储在我的 java 文件 reside.I 当前调用 shell 脚本的位置的 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 是脚本 runs.The 当前实现运行良好的文件位置,但问题是我必须将我的脚本存储在 server.Its webapp 的某个位置通过制作 war 文件部署在 apache-tomcat 服务器上。最好有一个相对路径,并在生成脚本时将脚本存储在 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 没有给我脚本的路径 location.In 我发现它的调试器工具为空。

由于 ClassLoader.getSystemResource returns a URL 和 ProcessBuilder 只接受字符串,我不能直接附加它们。

如果在 tomcat 中部署,请尝试将您的脚本放入 war 的 WEB-INF 中。现在假设您从可以使用的 servlet 启动该过程

ServletContext ctx = getContext();
String pathForProcessBuilder = ctx.getRealPath("/WEB-INF/script.sh");

如果您不想使用 ServletContext,请尝试使用

getClass().getClassLoader().getResource("/WEB-INF/script.sh")

而不是使用 ClassLoader(为了确保您使用 "correct" classloader,即加载您的 class 的那个)