Выполнение сценария оболочки внутри файла JAR. Как извлечь? - PullRequest
2 голосов
/ 07 июля 2011

Я занимаюсь разработкой Java-приложения только для Linux, и мне нужно выполнить в нем скрипт оболочки.Согласно тому, что я прочитал, единственный способ выполнить этот сценарий оболочки - это извлечь его из файла jar и выполнить.Вопрос в том?Как я могу извлечь этот сценарий оболочки во время выполнения?

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 30 октября 2015

Я нашел этот вопрос сегодня ... я думаю, что есть лучший ответ:

unzip -p JARFILE SCRIPTFILE |Баш

должен это сделать.где JARFILE - это путь к файлу jar, а SCRIPTFILE - путь внутри jar файла скрипта, который нужно выполнить.

это извлечет файл в стандартный вывод, который затем передается в оболочку (bash)

3 голосов
/ 07 июля 2011

Unix не знает, как запускать скрипты внутри jar-файлов.Вы должны создать файл (есть процедуры для создания временных файлов во время выполнения) с заданным содержимым, а затем запустить этот файл - см. Как запустить сценарий оболочки Unix из кода Java? для получения инструкций.Когда закончите, удалите его из файловой системы.

0 голосов
/ 12 июня 2019

Как уже упоминалось ранее, вы можете скопировать содержимое ресурса комплекта во временную папку, выполнить сценарий и удалить сценарий во временной папке.

Вот код для этого. Обратите внимание, что я использую библиотеку Goggle Guava.

// Read the bundled script as string
String bundledScript = CharStreams.toString(
    new InputStreamReader(getClass().getResourceAsStream("/bundled_script_path.sh"), Charsets.UTF_8));
// Create a temp file with uuid appended to the name just to be safe
File tempFile = File.createTempFile("script_" + UUID.randomUUID().toString(), ".sh");
// Write the string to temp file
Files.write(bundledScript, tempFile, Charsets.UTF_8);
String execScript = "/bin/sh " + tempFile.getAbsolutePath();
// Execute the script 
Process p = Runtime.getRuntime().exec(execScript);

// Output stream is the input to the subprocess
OutputStream outputStream = p.getOutputStream();
if (outputStream != null) { 
    outputStream.close();
}

// Input stream is the normal output of the subprocess
InputStream inputStream = p.getInputStream();
if (inputStream != null) {
    // You can use the input stream to log your output here.
    inputStream.close();
}

// Error stream is the error output of the subprocess
InputStream errorStream = p.getErrorStream();
if (errorStream != null) {
    // You can use the input stream to log your error output here.
    errorStream.close();
}

// Remove the temp file from disk
tempFile.delete();
0 голосов
/ 30 мая 2019

Во-первых, не связывайте скрипт в банке.Разверните сценарии как независимые файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...