会社が4期目を迎えました。おめでたいです。
(画像はWikipediaさんより。)
どうも、もぎーです。
今回は私が実際に現場で発生したローカル環境のTomcatが起動しない問題について、実際の事例を基にその原因、対処法を深堀してみます。環境は以下の通り。
OS:Window10
IDE:Eclipse Oxygen
他:Tomcat 8.0, Java SE8, SA-Struts
事例1 s2containerがうまく初期化できない
Tomcatに正しく資材(libなど)がデプロイされているかを確認しましょう。
自分の現場の環境では正しくデプロイされていない際にs2containerがうまく立ち上がらない旨のエラーメッセージが表示されました。
その際は、Tomcatにデプロイしてあるものを物理削除して再度eclipseからデプロイし直せば解消します。
もちろん、その際にプロジェクトのビルドやクリーン(+ビルド)は不要です。やたらめったらビルドを走らせるのは悪手です。
事例2 jsp内のEL式がうまく展開できない
このオプションを追加して対応しました。
1 |
-Dorg.apache.el.parser.SKIP_IDENTIFIER_CHECK=true |
org.apache.el.parserについて調べたところ、大抵の場合はEL式内でJava言語として予約語に設定されているワードを使用した際にJavaの構文的にエラーと解釈され、ElExceptionがthrowされているかと思います。少なくとも自分の場合はそうでした。
(例えばclassとかstaticとかですね。)
EL式をパースする際に、上記スキップのオプションを有効にすることでJava言語としてのチェックをスキップするようになるのでElExceptionが発生しなくなっていたようでした。
参考:https://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html
事例3 エラーログの詳細が出てくれない
このオプションを追加して対応しました。
1 2 |
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%/conf/logging.properties" |
この事象については、今となっては再現できず検証不可能なので、推測の記載になります。。。。
事象としては、エラー詳細が出る場合と出ない場合がある。
おそらくログレベルの問題、もしくはロガーやログ出力先が複数あってEclipseコンソールに出力する設定になるものだけが表示されていた。のどちらかが原因。
※ログレベルについて覚えていないのと、エラーログ出力先についてはEclipseのconsoleのログしか確認しおらず推測でしかありません。
ちなみに追加したオプションは、以下を設定できるオプションです。
・java.util.logging.manager:ログ設定ファイルを読み込むManagerを指定します
・java.util.logging.config.file:Managerで読み込むファイルを設定します。また設定ファイルの記載内容は出力するログレベルを設定したり、ログの出力先やログのフォーマットなどを設定できます。
トラブルシューティング的なのはこの辺りです。
他にも細かい問題はありましたが、大きめの問題はこれらでした。
中でも、事例1にあるようにeclipseのTomcatへのデプロイがかなり怪しく、Tomcatのクリーンをeclipseからやる際は見守り、ダメそうならこちらから物理削除+再公開をするなどeclipseにすべてお任せ。ではなく自分で試行錯誤することも重要と感じました。
(他に経験した現場でもeclipseのTomcatへのデプロイはよく失敗した状態になってました。)
おまけタイム
案件は新規開発はなくグロースハックの案件だったので、基本的には今あるソースをローカルで動かし検証をするという流れでした。
なので、この環境ではいかにプロジェクトのビルドを走らせることなくデバッグするかが重要でした。
それに対してはホットデプロイを効率よく使用し、コーディングなどが必要な際は他のエディタで編集をするなどして乗り越えました。
(コードをいじり始めるとインテリセンスの読み込みでeclipseがエラーを吐くので、Google検索+SAKURAエディタなどの方が効率が良いことが多かった。)
ちなみにホットデプロイですが、ホットデプロイの設定をしてある状態でTomcatを起動し、その後eclipseでコードを変更したらプロジェクトのビルドをします。
プロジェクトのビルドをすると変更された部分のみビルドが行われてホットデプロイされます。
最低限のビルドでデバッグすることができるのでもし知らなかった人がいたらこうすると良いでしょう。
最後に、どの現場に出ても何かしら環境面で問題が発生することはよくありますが、
エンジニアとしての成長に繋がる良いチャンスだと思って、
毛嫌いする事なくその都度一つ一つ地道に調査して原因を解決していく事が意外に大事だと痛感しました。