有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    这不是关于Java,而是关于shell。据我所知,shell解释器无法执行驻留在zip文件中的脚本。所以你有几个选择:

    1. 将shell脚本作为文本文件从java程序中读取。 在temp dir或任何其他相关位置创建一个临时文件,并将文件的内容复制到那里,然后用这个临时脚本调用shell解释器。 我相信这是最好的方法

    2. 由于jar是一个zip,您可以从shell中解压它,找到一个脚本并执行shell。同样,这更尴尬,也更错误,但从技术上讲,它应该是可行的

    3. >P>如果脚本中没有低级别的内容,可以考虑将逻辑重写为Groovy脚本(也许您会找到有用的GroOSH项目)。 然后从内存而不是文件中调用groovy代码

    好吧,我没有主意了,如果我是你,我会实施第一个解决方案:) 祝你好运,希望这能有所帮助