ProcessBuilder在资源文件夹中找不到sh文件-Spring Boot

时间:2018-10-24 08:59:43

标签: java spring spring-boot processbuilder

我已经在互联网上搜索解决方案一段时间了,但是没有一个人能清楚地知道如何执行sh文件。

我有一个外壳脚本install.sh,该脚本已保存在resources目录中。我想从ProcessBuilder运行它。无论我尝试什么,我都会不断遇到No such file or directory错误。这是我的代码:

String masterURL = config.getMasterUrl();
String adminToken = config.getAdminToken();

ProcessBuilder installScriptBuilder = new ProcessBuilder();
installScriptBuilder.command("install.sh", dir, namespace);
installScriptBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);

Map<String,String> installEnv = installScriptBuilder.environment();
installEnv.put("URL", masterURL);
installEnv.put("TOKEN", adminToken);

try {
    Process p = installScriptBuilder.start();
} catch (IOException e) {
    e.printStackTrace();
}

我已经阅读了有关在其他答案中创建临时文件的信息,但没有一个文件清楚地说明如何解决该问题。我已经使用Spring Initializr创建了我的项目。

4 个答案:

答案 0 :(得分:1)

您可以使用“ classpath:install.sh”选择资源文件。

在这种情况下,我们不能这样做。我们需要路径本身:

final ClassLoader classLoader = getClass().getClassLoader();
    final File file = new File(classLoader.getResource("install.sh").getFile());
    final ProcessBuilder installScriptBuilder = new ProcessBuilder();
    installScriptBuilder.command(file.getPath());

答案 1 :(得分:1)

我相信这支班轮应该可以工作:

installScriptBuilder.command(new ClassPathResource("install.sh").getPath());

答案 2 :(得分:0)

resources文件夹未保留在目标中。它是maven的文件夹结构。您可能需要查看target文件夹,以了解install.sh文件的位置。可以在classpath的root上访问它。

答案 3 :(得分:0)

资源位于类路径上,通常压缩到jar中,因此是只读的,而不是文件系统上的File。

使用资源作为 template 将其复制到文件系统。

Path path = dir.toPath().resolve("install.sh"); // dir a File
Path path = Paths.get(dir, "install.sh"); // dir a String
InputStream in = getClass().getResourceAsStream("/install.sh");
Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);