2

Tomcat サーバーを起動するためにプログラムで startup.bat を実行しています。

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.batTomcat コンソールで新しいウィンドウを開き、すぐに戻るため、この問題に直面しています。

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

プロセスを自動化するには、サーバーを起動する前に、展開するアプリを tomcat 展開フォルダーにコピーする必要があります。.war パッケージを TOMCAT/webapps フォルダーにコピーすると、Tomcat の起動時にデプロイされます。

したがって、ファイルをコピーするだけです。Java でそれを行う方法の 4 つの異なる例を次に示しますそれか、コピーコマンドを実行するだけです。

おそらく最も簡単でエラーが発生しにくいのは、Java 7 でファイルを使用して行うことです。

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

その後、exec start コマンドを実行します。


更新: シャットダウンすると、待機の問題が発生します。バッチファイルで次のようなことをするのを待つことができます:

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 について話していることを忘れていました。上記のバットを使用して、Java .waitFor() を使用するか、Java ファイルで同じロジックをプログラムすることもできます。

于 2013-10-03T11:58:52.873 に答える
0

start コマンドを削除して、フォアグラウンドでバッチ ファイルを実行します。次に、waitFor() はバッチ ファイルの完了を待ちます。

プロセス p = Runtime.getRuntime().exec("cmd /c " + パス + "\RunFromCode.bat");

RunFromCode.bat が EXIT コマンドを実行すると、コマンド ウィンドウは自動的に閉じられます。それ以外の場合、EXIT で明示的に終了するまで、コマンド ウィンドウは開いたままになります。どちらの場合も、ウィンドウが閉じられるまで Java プロセスは待機します。

于 2013-10-03T11:34:11.860 に答える