我正在开发一个仅支持Linux的Java应用程序,我需要在其中执行一个shell脚本。根据我所读到的,执行该shell脚本的唯一方法是从jar文件中提取并执行它。问题是?如何在运行时提取该shell脚本?
提前谢谢
答案 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();