在jar文件中执行shell脚本。如何提取?

时间:2011-07-06 22:28:37

标签: java shell

我正在开发一个仅支持Linux的Java应用程序,我需要在其中执行一个shell脚本。根据我所读到的,执行该shell脚本的唯一方法是从jar文件中提取并执行它。问题是?如何在运行时提取该shell脚本?

提前谢谢

4 个答案:

答案 0 :(得分:3)

Unix不知道如何在jar文件中运行脚本。您必须使用给定内容创建一个文件(有运行时创建临时文件的例程),然后运行该文件 - 有关说明,请参阅How to run Unix shell script from Java code?。完成后,将其从文件系统中删除。

答案 1 :(得分:3)

我今天发现了这个问题......我认为有一个更好的答案:

unzip -p JARFILE SCRIPTFILE | bash

应该这样做。 其中JARFILE是jar文件的路径 和SCRIPTFILE是要执行的脚本文件jar的路径。

这会将文件解压缩到stdout,然后将其传送到shell(bash)

答案 2 :(得分:0)

首先不要将脚本捆绑在jar中。将脚本部署为独立文件。

答案 3 :(得分:0)

正如之前提到的那样,您可以将捆绑软件资源中的内容复制到临时位置,执行脚本,然后删除临时位置中的脚本。

这是执行此操作的代码。请注意,我正在使用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();