クラスロードってばよ。
お久しぶりの投稿のシステム開発部の”さいちゅう“です。
自分の担当プロジェクトもついにリリース目前でもう少しで一息つく一時がやってきます 😀
今回もいろいろとドはまりした場面がありましたがその中でちょいはまりした内容を展開したいと思います。
開発部はアプリケーションを作る側が基本的な仕事内容ですが、時にそのサーバの仕組みを知っていないと裏で何が動いているか正直さっぱりわかりません。
今回はJavaVMでWebアプリケーションサーバを立ち上げたときにclasspathが何を設定されているか。
またそのclasspathがどの順番で設定されているか把握しなければ設定によってWebアプリケーションサーバのライブラリが使用されている場合があります。
つまりよく使用するlog4j.jarなどはアプリケーション側は1.2を使用しているとしましたら、JavaVMを立ち上げ時にlog4j,jar(version1.3)が先にclasspathが設定されていたら条件付きですが1.3を使用して動かしてしまう場合があります。
回避策は色々とネットで転がっていますので今回はまずのバージョンを使っているかどうかを確認方法。
今回はJavaVM上の確認方法です。
1.まずは自分の使用しているjarファイルを展開しMANIFEST.MFに記載しているバージョンを確認。
2.WebアプリケーションサーバのJAVA_OPTIONSに 「-verbose:class」を設定し、サーバを再起動する。
3.実際にWebアプリケーションサーバにリクエスト(GET,POST)を実行しコンソールログ(標準出力)を確認。
4.ログにclassロード時にどのjarを読み込んでいるか出力されています。file:///projct/domains/lib/log4j.jar など出力されているのが実際に使用しているjarの格納先のpathが出力されています。
多少説明を省いていますが、大体こんなもんで使用しているjarの確認ができます。
ソースでも確認できますがwarファイルを再度作成して確認するなど手間はかかりますし場合によってはnullが返ってくる場合がありますのであまり推奨はしませんが念のため予備知識として記入しておきます。
例 Stringクラスの場合
String.class.getPackage().getImplementationVersion();
こちらをメインクラスに仕込んでおくと良いでしょう。判断がつかない場合はnullが返ってくるのは仕様みたいです・・・。
なので推奨はしません・・・。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Package.html#getImplementationVersion–
Eclipseのtomcatなどアプレットなどで実行確認の場合はシンプルに実行構成の「-verbose:class」を仕込むと画像のようにコンソールにシュババババと出力されます。
さらに追及したい人はググるかさいちゅうまで直接ご連絡もらえたらお答えしますね 😆
以上、さいちゅうでした~。
=============================================
ヒューマンリレーションネクストでは、
未経験や新卒の方を積極的に採用しております。
「やりがい」のある環境で仲間と共に成長しながら働きませんか?
営業職(ITコンサルタント)
ITエンジニア(システム開発、インフラ)
http://hr-next.co.jp/index.php/recruit/250-2010-07-21-05-05-01.html
新卒の方はこちら【マイナビ2017】
https://job.mynavi.jp/17/pc/search/corp200795/outline.html
【リクナビ2017】はこちら
https://job.rikunabi.com/2017/company/top/m844110027/
==============================================