等到tomcat启动结束

时间:2013-10-03 09:28:16

标签: java tomcat

我以编程方式执行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 个答案:

答案 0 :(得分:3)

您遇到此问题,因为startup.bat会使用Tomcat控制台打开一个新窗口并立即返回。

即使您使用catalina.bat而不是startup.bat,这仍然无效,因为只有当Tomcat停止时该进程才会终止。

从技术上讲,你永远不会知道tomcat是否已启动,或者直到日志告诉你。所以你采取的方法可能不起作用。

我能想到的唯一原始解决方案是(使用相同的代码),一旦启动Tomcat,就会定期检查控制台日志文件中的特定字符串(如{ {1}}等)表明服务器已启动。

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

答案 1 :(得分:0)

您可以使用Runtime创建流程,然后等待流程完成。

您可以通过执行以下操作来完成此操作。

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

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

答案 2 :(得分:0)

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

  

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

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

答案 3 :(得分:0)

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

所以你需要做的就是复制文件。 here是关于如何在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”。

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