我在“引擎”包中的 JAR 文件中打包了一个 shell 脚本。
在我的程序中,我正在使用 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 脚本,并且能够执行该脚本。