【问题标题】:How can Java execute batch file in separate process treeJava如何在单独的进程树中执行批处理文件
【发布时间】:2012-03-11 17:14:57
【问题描述】:

我正在为我的 Java 应用程序编写一个更新机制。 我创建了一个 Windows 批处理文件,退出我的程序,批处理文件继续删除我的 Jar,从远程位置复制新的,启动 jar。 我的问题:删除+复制有效,但是-应用程序无法启动。 我认为问题在于我不知道如何让 Java 在单独的进程树中执行批处理文件。 运行时: 运行时.getRuntime() 我打开一个子进程。

所以我的问题 - Java 如何在单独的进程树中执行批处理文件?

【问题讨论】:

  • 这种类型的功能被Java Web Start处理得很好。自动更新只是它提供的众多功能之一(它适用于 Windows、OS X 和 *nix)。

标签: java windows process batch-file runtime


【解决方案1】:

Here 是一种使用 cmd 作为中间层的解决方法:

public class Main {
    public static void main(String[] args) throws Exception {
        Process p = Runtime.getRuntime().exec("cmd /c c:\\test.bat");
    }
}

test.bat 将包含的位置

@echo off
PING 1.1.1.1 -n 1 -w 5000 >nul
java -jar "[path]"

【讨论】:

  • 好吧,如果您不关心特定于平台的问题,您可以尝试在 Windows 中安排一个事件,该事件会在更新程序完成后长时间(一分钟)执行 jar 文件。即便如此,这也是一个很长的目标。
【解决方案2】:

我相信答案隐藏在 Jakub Zaverka 提供的链接中。使用start 而不是cmd 来启动批处理文件。这将为批处理提供自己的控制台窗口。

【讨论】:

  • 它不起作用。出现同样的问题。我需要一个技巧来在 java 中启动一个单独的进程。否则,它就像一个子进程尝试启动它的父进程。
  • 您是否仔细阅读了 Jakub 帖子中的“此处”链接? Windows 没有子进程,除了共享控制台 stdin/stdout/stderr。 START 使用自己的流创建一个新的控制台窗口。您一定有其他问题,或者您使用 START 的方式有问题。也许您应该发布失败的代码,以便其他人可以更好地诊断问题。例如,如果您使用 START 并引用批处理文件的名称,那么您还必须提供带引号的窗口标题作为第一个参数。空字符串(“”)很好。
  • 嗨,我解决了这个问题。这是由于launch4j - 我用这个程序扭曲了我的JAR。因为它允许一个实例,即使我删除了预升级文件,它也不允许我从在预升级程序下启动的命令行启动新实例。现在我在没有一个实例验证的情况下扭曲我的程序,它工作正常!非常感谢您的帮助!
【解决方案3】:

我解决了这个问题。 这是由于launch4j - 我用这个程序扭曲了我的JAR。因为它允许一个实例,即使我删除了预升级文件,它也不允许我从在预升级程序下启动的命令行启动新实例。 现在我在没有一个实例验证的情况下扭曲我的程序,它工作正常! 感谢大家的热心帮助!

顺便说一句 - 我用这个解决方案验证了一个实例 - How to allow running only one instance of a Java program at a time?

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多