ProcessBuilder 在资源文件夹中找不到 sh 文件 - Spring 启动
ProcessBuilder cannot find sh file in resources folder - Spring Boot
我在互联网上搜索了一段时间的解决方案,但none给出了 sh 文件将如何执行的清晰图像。
我有一个 shell 脚本 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();
}
我在其他答案中读到过有关创建临时文件的内容,但 none 清楚地展示了如何解决这个问题。我使用 Spring Initializr 来创建我的项目。
您可以 select 资源文件 "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());
resources
文件夹未在目标中维护。这是maven的文件夹结构。您可能需要查看 target
文件夹以了解 install.sh
文件所在的位置。它将可以在类路径的 root
.
上访问
资源在 class 路径上,通常压缩到 jar 中,因此是只读的,而不是文件系统上的文件。
使用资源作为模板将其复制到文件系统。
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);
我相信这个衬垫应该有用:
installScriptBuilder.command(new ClassPathResource("install.sh").getPath());
我在互联网上搜索了一段时间的解决方案,但none给出了 sh 文件将如何执行的清晰图像。
我有一个 shell 脚本 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();
}
我在其他答案中读到过有关创建临时文件的内容,但 none 清楚地展示了如何解决这个问题。我使用 Spring Initializr 来创建我的项目。
您可以 select 资源文件 "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());
resources
文件夹未在目标中维护。这是maven的文件夹结构。您可能需要查看 target
文件夹以了解 install.sh
文件所在的位置。它将可以在类路径的 root
.
资源在 class 路径上,通常压缩到 jar 中,因此是只读的,而不是文件系统上的文件。
使用资源作为模板将其复制到文件系统。
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);
我相信这个衬垫应该有用:
installScriptBuilder.command(new ClassPathResource("install.sh").getPath());