web-dev-qa-db-ja.com

Tomcat 7.0.22WindowsサービスがJREアップデートで壊れます

最初にTomcatサービスを手動で停止せずにJRE更新を実行すると、Tomcatは次に停止した後に開始されなくなります。これはほとんどの場合、JREインストーラーの要求に従って再起動した後に発生します。

エラーを再現するため

  • Java 6u29がインストールされたWindowsサービスとして最新のTomcat7をインストールします。Tomcatは正常に動作するはずです。
  • 最初にTomcatサービスを停止せずにJava 6u31に更新。Javaサーバーが再起動し、再起動後、Tomcatサービスは開始されなくなります。

再起動後のログ

Tomcat 7 stdout

2012-04-03 12:25:02 Commons Daemon procrun stdout initialized 
2012-04-03 12:42:25 Commons Daemon procrun stdout initialized 
Error occurred during initialization of VM Java/lang/NoClassDefFoundError: Java/lang/Object 

Tomcat7 stderrの最後の部分(Java更新して再起動します)

2012-04-03 12:42:25 Commons Daemon procrun stderr initialized
3
Rick

これは、Windowsサービスとして実行される長時間実行(Tomcatではない)Javaアプリで確認されています。これは、Apache Commons Daemonの「procrun」メカニズムを使用してWindowsサービスとして作成します。これは、TomcatWindowsサービスが機能するのと同じ方法です。

これに関する他のレポートのヒントから、Java更新プロセスは、新しいバージョンへのアップグレードの一環としてファイルを移動/名前変更しているようです。インストールの完了時に1つか2つの名前変更が残っている可能性があり、それらの名前変更は再起動後に行われることになっています。ただし、更新の実行と同時に実行時間の長いJavaアプリがある場合、そのアプリにはさまざまなJavaライブラリとexe(メインのjre.exeなど)が含まれます。ロックされ、Java更新は失敗します。

この症状の1つは、コマンドウィンドウを開いて「Java-version」と入力することです。 Java/lang/Objectでnoclassdeffoundエラーが発生した場合は、JDKアップグレードと長時間実行されるJavaアプリの組み合わせにより、破損したJDK/JREが残っていることは間違いありません。

2つの回避策が見つかりました。(1)アプリを再インストールします。 (2)Javaを再インストールします。 (1)必要に応じて、クリーンバージョンのJavaもインストールするアプリのインストーラーがあるため、通常は機能します。ただし、「jarファイル 'reach-stream-installer-izpack.jar'を実行できませんでした」というメッセージが表示されて失敗することもあります。 (IzPackは、私たちが使用する自動インストーラーツールです)。この場合、(2)にフォールバックします。

どちらの回避策も非常に優れています。 Javaによって提供される自動化されたJDK更新機能がアプリケーションを壊してしまうのは残念です。

最初の投稿以降、これについて何か進展はありましたか?

2
Jerry Gaines