繁体   English   中英

如何在Jar文件中执行程序

[英]How to execute a program within a Jar file

所以我的问题是,我制作了某种启动器并写了一个方法,如果你点击“播放”按钮就被调用。

private void PlayButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
    try 
    {
        new ProcessBuilder("src/calc.exe").start(); 
    } 
    catch (IOException ex) 
    {
        Logger.getLogger(Launcher.class.getName()).log(Level.SEVERE, null, ex);
    }
}  

正在执行的文件只是Windows中计算器的一个副本,位于我项目的src文件夹中。 (路径是“src / calc.exe”)

一切正常,因为我没有将我的netbeans项目文件编译成JAR文件。

如果我运行JAR文件并单击播放按钮 - 没有任何反应。

我真的希望你能告诉我如何解决这个问题。

(PS:calc.exe并不总是要运行的程序的名称。文件名由.ini确定.calc.exe仅用于测试程序。)

首先,一些背景:

  • JAR文件是一个存档,一个包(压缩与否),包含Java字节码和可以从JVM内部使用的其他资源。
  • EXE文件是可执行的二进制文件,只能由Windows / MS-DOS系列操作系统理解。

当您运行程序而不将其打包到JAR文件中时,可以从操作系统访问所有资源(类文件和可执行文件)。 Windows将启动JVM,并从内部通过ProcessBuilder指示操作系统调用可在相对于执行执行指令的类的路径中访问的可执行文件。 在那里,一切都很好,正如你所说,它的工作原理。

但是,当您将Java类和可执行文件打包到JAR中并调用JAR时, 操作系统将无法再访问内容 发生的事情是操作系统将启动JVM,它将处理JAR文件以查找可执行类(您调用ProcessBuilder )。 从该类文件中,您现在指示操作系统启动可执行文件,该可执行文件位于相对于JAR文件的路径中,而不是相对于执行调用指令的类文件。 由于EXE 位于JAR文件内而不是相对于它 ,因此执行失败,因为它无法找到可执行文件。

这就是这种方式,因为操作系统不会在JAR文件中查找特定文件,对于操作系统而言,JAR文件只是一个文件,而不是文件夹,因此它将忽略其内容。

因此,结论是,由于您正在调用操作系统以在另一个文件中执行特定操作,因此只需将该文件放在JAR之外并放在该JAR的相对路径中。

如果由于某种原因你坚持在EXAR中包装你的EXE,那么你需要在调用ProcessBuilder到临时文件夹并使用新路径调用ProcessBuilder之前将它提取到JAR之外。

这是一个敏感的话题。

谁评论说JAR无法做到这一点是错误的。 相反,除非作者通过Oracle签名和验证,否则applet没有这样的权限。

你说这一切都很好,除非你把它放在JAR中。 这可能是因为您的URI相对于Windows文件系统。

通常获取文件的方式,无论参考周围的包装是做这样的事情:

    MainClass.class.getResourceAsStream(file);

静态getResourceAsStream将解析可用的相对路径和绝对路径,如果你把“src / calc.exe”放在这里,它应该可以工作。

另一个建议是打开流程。 如果您将程序作为单个线程,则Java程序将挂起,直到外部进程消失并清除为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM