Java Execute Shell Script 捆绑在 JAR 中
我有一个shell脚本打包到“引擎”包中的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 脚本,并能够执行该脚本。