可能重复的问题:
如何在JAR文件中执行一个shell脚本?如何提取?
我将一个shell脚本打包进了我的“engine”包内的JAR文件。
在我的程序中,我使用Process和ProcessBuilder运行一个shell命令。这一切都很好地工作。
如果我在我的电脑上指定shell脚本的路径,那么程序就可以正常工作。但是,如果我将shell脚本打包进我的JAR文件并像这样访问它:
scriptLocation = this.getClass().getResource("/engine/shell-script.sh").toString();
运行程序后,我得到以下错误:
java.io.IOException: Cannot run program "file:/Users/USERNAME/Desktop/Application-Name.jar!/engine/shell-script.sh": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at java.lang.Runtime.exec(Runtime.java:593)
at java.lang.Runtime.exec(Runtime.java:431)
at java.lang.Runtime.exec(Runtime.java:328)
at engine.Download$1.run(Download.java:39)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:53)
at java.lang.ProcessImpl.start(ProcessImpl.java:91)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
... 5 more
我开始认为这似乎做不到,但我非常希望将此shell脚本作为应用程序的一部分提供,这可行吗?
提前感谢大家。
======== 更新 ==========
最终,我解决了这个问题。Shell无法在JAR包中执行脚本,这与Java无关,而是与shell有关。我通过以下方式解决了这个问题:
Java有一个createTempFile()方法(选项是在应用程序终止后删除文件),调用该方法,并将文件写入您想要访问此临时文件的JAR包中。然后,您就可以在本地文件系统上拥有shell脚本,并能够执行该脚本。