【问题标题】:Running an external program from an executable Jar从可执行 Jar 运行外部程序
【发布时间】:2017-06-26 13:57:04
【问题描述】:

我为其他人开发的 cmd 程序创建了一个简单的 SWING gui。要运行这个程序,我执行这一行:

Process convertProcess = Runtime.getRuntime().exec("jlyt\\prog\\com_win\\jlyt.bat " + selectedFiles.getName());

jlyt 文件夹与我的src 文件夹位于同一文件夹中(我使用的是 IntelliJ)。 当通过 IDE 运行时,一切都很好,但当我运行我创建的 jar 时就不行了。我尝试从 IntelliJ 保存的目录以及 jlyt 文件夹的目录中运行它。 我没有将外部程序(在 jlyt 文件夹内)添加到我的 jar 中,因为它非常重。我希望我的 jar 与原始程序一起分发,而不是包含所有内容。

知道我应该如何构建我的 jar 吗?

谢谢。

【问题讨论】:

    标签: java swing intellij-idea jar


    【解决方案1】:

    我明白你为什么将 /jlyt 放在 /src 中,它在 IDE 中起到了便利的作用。 /jlyt 将作为资源复制到 /bin/classes 或任何 IDE 目标中,这使得一切都可以在 IDE 中工作。

    当您 JAR 应用程序时,通常会将 /jlyt 添加到 JAR;但是,Windows 无法访问它。我假设您在尝试运行时将 /jlyt 的副本放在与 JAR 相同的文件夹中。

    第一步,在终端中,将当前目录设置为包含 JAR 和 /jlyt 的文件夹。由于您在 exec() 中指定了一个相对路径,这应该足以让一切运行。

    您也可以尝试创建 JAR 的快捷方式,因为它是可执行的,并将工作目录设置为包含 JAR 的文件夹。

    【讨论】:

    • 我没有将 /jlyt 放在 /src 下,因为我不想将它添加到 jar 中。文件夹 /jlyt 与 /src 处于同一级别,我想使用 jar 中的相对路径。我在创建 jar 时实际上排除了 /jlyt
    • 好的。然后我所说的其余部分应该适用。重点是设置当前目录。
    【解决方案2】:

    您必须根据您的 jar 文件使用基于 jlyt.bat 所在位置的相对路径。

    例如使用“./”或“../”向上导航目录树。

    【讨论】:

      【解决方案3】:

      JAR 文件的位置仅与启动 JAR 相关。工作目录必须是包含 jlyt 文件夹的目录,因为您使用 'jlyt\...' 作为可执行文件的路径。

      例如,假设以下目录结构:

      somewhere
          project
              gui
                  appl.jar
              jlyt
                  prog
                      ...
      

      工作目录必须是“项目”,然后 JAR 将被引用为“gui\appl.jar”

      C:\somewhere> cd project
      C:\somewhere\project> java -jar gui\appl.jar
      

      在退出您的应用程序/java 之前,请务必等待转换进程终止(例如convertProcess.waitFor()) - 我相信当 Java 虚拟机关闭时,任何正在运行的外部进程都会被杀死!

      流程文档中的提示:

      从 1.5 开始,ProcessBuilder.start() 是创建流程的首选方式。

      【讨论】:

      • 如果我按照您的示例进行操作,那么 appl.jar 实际上与 jlyt 目录处于同一级别,这意味着它们都在项目下。这仍然没有奏效。也许我需要编辑 jlyt,bat 的相对路径?但是缺少什么?
      • @exigez 在我的示例中,appl.jar 在“project*\gui*”下,即在“gui”下,在“project”下...注意缩进,还要注意cmd java -jar gui\appl.jar 显然必须在gui下
      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 2020-04-17
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2014-09-12
      • 2020-10-15
      相关资源
      最近更新 更多