最初にTomcatサービスを手動で停止せずにJRE更新を実行すると、Tomcatは次に停止した後に開始されなくなります。これはほとんどの場合、JREインストーラーの要求に従って再起動した後に発生します。
エラーを再現するため
再起動後のログ
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
これは、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更新機能がアプリケーションを壊してしまうのは残念です。
最初の投稿以降、これについて何か進展はありましたか?