【问题标题】:How to execute script from JAR file?如何从 JAR 文件执行脚本?
【发布时间】:2012-07-05 07:49:43
【问题描述】:

我有一个 Maven 项目,我正在尝试执行一个脚本(用 R 编写)。我也将此脚本文件放在源代码目录中。我发现这个脚本根本没有执行。但是,当我将此脚本移到 jar 文件之外时,它会执行!谁能告诉我为什么,并给我一些解决方案以将脚本放入 jar 中同时确保其执行?

非常感谢!

【问题讨论】:

    标签: java maven jar


    【解决方案1】:

    我会做以下事情:

    • 使用 ClassLoader.getResourceAsStream() 获取文件的 InputStream
    • 将此 InputStream 写入 tmp 目录
    • 用 Runtime.getRuntime().execute(..) 执行它

    【讨论】:

    • @carlspring 是的,我同意,但最好为步骤 2 提供一点代码。我不知道如何创建临时文件,临时文件所在的位置,然后删除它在退出?谢谢~
    • @EnsomHodder 要创建使用这样的东西: File.createTempFile("prefix", "suffix")
    • @EnsomHodder 删除使用 File.deleteOnExit();
    • @KonstantinSolomatov 所以在创建临时文件后,我创建了一个输出流将脚本文件写入这个新创建的 tmp 文件,然后调用它?
    • @KonstantinSolomatov 对不起,我正在尝试你的方法,但我无法做到。首先,我从给定的文件名“./src/main/resources/aaa.R”(要执行的脚本)中获取 inputstream ;其次,我创建了一个临时文件,并从中创建了一个 FileOutputStream 来写入脚本。但是,当我的程序尝试从 获得的输入流中读取字节数组时,它将引发 NullPointerException getResourcesAsStream。你能帮我活下来吗?非常感谢您的帮助!
    【解决方案2】:

    jar里面的文件已经不是文件了,所以要执行它首先需要extract it somewhere然后从外部提取的文件路径执行它

    【讨论】:

    • 你的意思是提取整个jar文件还是只提取要执行的脚本文件?你能告诉我如何从 jar 中提取一个文件吗?
    • 只需从jar中提取所需的文件,有关更多详细信息,请参阅链接
    • 感谢您的帮助。执行脚本后,我必须删除提取的文件。好像不是很干净~不过最重要的是还可以
    • 顺便说一句。不知道ACWrapper这个类从何而来?你能解释一下吗?谢谢
    【解决方案3】:

    您需要从 jar 文件中提取脚本:

    jar -xvf my.jar com/foo/my.script.sh
    

    【讨论】:

    • 所以你的意思是最好从Java程序执行这个命令,然后执行第二个命令(提取文件)?看起来很简单,没有任何外部库支持~
    最近更新 更多