我以编程方式执行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中自动化构建部署的手动过程。
答案 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文件中编写相同的逻辑。