JAR中绑定的Java执行Shell脚本
Possible Duplicate:
Executing a shell script inside a jar file. How to extract?
我将一个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脚本,并且能够执行该脚本
# 1 楼答案
这不是关于Java,而是关于shell。据我所知,shell解释器无法执行驻留在zip文件中的脚本。所以你有几个选择:
将shell脚本作为文本文件从java程序中读取。 在temp dir或任何其他相关位置创建一个临时文件,并将文件的内容复制到那里,然后用这个临时脚本调用shell解释器。 我相信这是最好的方法
由于jar是一个zip,您可以从shell中解压它,找到一个脚本并执行shell。同样,这更尴尬,也更错误,但从技术上讲,它应该是可行的
好吧,我没有主意了,如果我是你,我会实施第一个解决方案:) 祝你好运,希望这能有所帮助