ProcessBuilder не может найти файл sh в папке ресурсов - Spring Boot - PullRequest
0 голосов
/ 24 октября 2018

Я некоторое время искал решение в Интернете, но ни одно из них не дает четкого представления о том, как будет выполняться файл 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 голосов
/ 24 октября 2018

Я считаю, что этот лайнер должен работать:

installScriptBuilder.command(new ClassPathResource("install.sh").getPath());
0 голосов
/ 24 октября 2018
Папка

resources не поддерживается в целевой папке.Это папочная структура maven.Возможно, вы захотите взглянуть на папку target, чтобы понять, где находится ваш файл install.sh.Он будет доступен на root.

.
0 голосов
/ 24 октября 2018

Ресурсы находятся в пути к классам, обычно заархивированы в 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);
0 голосов
/ 24 октября 2018

Вы можете выбрать файлы ресурсов с помощью "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());
...