2

我正在以编程方式执行 startup.bat 来启动一个 tomcat 服务器。

ProcessBuilder processUnzip = new ProcessBuilder("cmd", "/c", "start", "C:\\apache-tomcat-6.0.37\\startup.bat");

我需要等到完整的 startup.bat 过程结束。但是程序在 startup.bat 启动后立即结束。

有没有办法等到启动过程结束

更新:

我的要求是在 tomcat 实例中部署 WAR 文件。我不能使用热部署或动态部署。我必须进行静态部署。基本上,任务是自动化在 tomcat 中构建部署的手动过程。

4

4 回答 4

3

您正面临这个问题,因为startup.bat使用 Tomcat 控制台打开了一个新窗口并立即返回。

即使您使用catalina.bat而不是startup.bat,这仍然无法正常工作,因为该进程仅在 Tomcat 停止时才会终止。

从技术上讲,您永远不会知道 tomcat 是否已启动,或者直到日志告诉您。因此,您采取的方法可能行不通。

我能想到的唯一粗略的解决方案是(使用与您相同的代码),一旦您启动 Tomcat,请每隔一段时间继续检查控制台日志文件,以获取Server started表明服务器已启动的特定字符串(如等)。

顺便说一句,如果你能告诉我们你的具体用例(你为什么这样做?),这里的社区可能会提出更好的选择。

于 2013-10-03T09:56:00.980 回答
0

您可以使用Runtime创建一个进程,然后等待该进程完成。

您可以通过执行以下操作来做到这一点。

Process process = Runtime.getRuntime().exec("cmd /c start file.bat");
int exit_value = process.waitFor();

在您的情况下,file.bat您要执行的文件在哪里。

于 2013-10-03T09:32:16.830 回答
0

删除启动命令以在前台运行批处理文件 - 然后,waitFor() 将等待批处理文件完成:

进程 p = Runtime.getRuntime().exec("cmd /c" + path + "\RunFromCode.bat");

如果 RunFromCode.bat 执行 EXIT 命令,命令窗口会自动关闭。否则,命令窗口将保持打开状态,直到您使用 EXIT 显式退出它 - 在任何一种情况下,java 进程都在等待窗口关闭。

于 2013-10-03T11:34:11.860 回答
0

要使该过程自动化,您应该在启动服务器之前将要部署的应用程序复制到 tomcat 部署文件夹中。如果您将任何 .war 包复制到 TOMCAT/webapps 文件夹,它将在 Tomcat 启动时被部署。

所以你需要做的就是复制文件。这里有四个不同的例子,说明如何在 Java 中做到这一点。要么,要么你可以只执行一个复制命令。

可能最简单且最不容易出错的方法是在 java 7 中使用 Files:

Files.copy(source.toPath(), dest.toPath());

完成后,然后执行启动命令。


更新:关机,你有等待问题。您可以等待在批处理文件中执行以下操作:

CALL shutdown.bat
:LOOP
tasklist /FI "WINDOWTITLE eq Tomcat" | find /C /I ".exe" > NUL
IF ERRORLEVEL 1 (
  GOTO :EOF
) ELSE (
  ECHO Tomcat is still running
  SLEEP 1
  GOTO LOOP
)

此代码假定一个名为“Tomcat”的 Tomcat 窗口。例如,如果您将 Tomcat 作为服务运行,则该假设不成立。但是对于服务,使用 sc 查询有更可靠的方法:

SC stop "tomcat"
:LOOP
SC query "tomcat" | FIND "STATE" | FIND "RUNNING" > NUL
IF ERRORLEVEL 1 (
  GOTO :EOF
) ELSE (
  ECHO Tomcat is still running
  SLEEP 1
  GOTO LOOP
)

这里假设服务名称“tomcat”。

更新2:忘了我们在这里谈论java - 使用上面的bat,您可以使用java .waitFor(),或者您也可以在java文件中编写相同的逻辑。

于 2013-10-03T11:58:52.873 回答