久しぶりにStrutsの事聞かれたので、Dockerでtomcatを動かして、SAStrutsのチュートリアルをデプロイして
デバッガが動くところまで、試してみた。(聞かれた事とは全く関係なかったりする)
ちなみに、もう10年くらいJavaでStrutsで的な事してない。。。
なので、設定とかは色々適当。最新のJ2EEがどんな感じなのかは全く知らない。
・準備
もろもろインストールする。
[1]eclipseをインストール(マシン変えてから入れてさえいなかった)
->書いている時点で最新?のNeon(4.6.1)をインストール
(EEではなく、普通のJava環境の奴を選択。
後から結局、WTP?を入れたorz)
[2]eclipseのプラグイン導入
SAStrutsの公式ページ見ながら適当に導入。
・Doltenプラグイン(S2用)
・プロパティエディタ(S2用)
・SAStrutsプラグイン(S2用)
・TomcatManager(不要だった。リモートデバッグには使わない。。。)
・JavaWebDeveloperTools(多分、WTP?の事?)
・JavaEEDeveloperTools(多分、WTP?の事?)
[3]DockerのTomcatイメージを導入
Macのjreが1.8だったのと(JDKを入れたか覚えてない)、
どのバージョンまでSAStrutsをtomcatで動かした記事があるか
ネットで調べ(よくは見ていない。一番上のリンクがtomcat8、jdk8だった。。。)、
dockerhubから公式をダウンロード。
docker run -p 8080:8080 --name tomcat8 -d tomcat:8-jre8
起動後、
とりあえず、localhost:8080で昔よく見た汚い猫画像を確認。。。
多分、コンテナの設定ファイルを触るのでemacsを導入する。
(viは苦手。)
docker exec tomcat8 /bin/bash
ログインして、
apt-get install emacs
※mobyはdebian系なのか?
インストールされたら、emacsを起動させるため、
とりあえず、環境変数設定
export TERM=xterm
設定後、emacsを起動し、「/root/.bashrc」に上記変数設定し保存。
# ~/.bashrc: executed by bash(1) for non-login shells.
# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022
# You may uncomment the following lines if you want `ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "`dircolors`"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'
export TERM=xterm
保存して、ログアウトし、docker commit
docker commit tomcat8 tomcat8withemacs
センスのない名前をつけてコミット後、速攻コンテナを消す
docker rm -f tomcat8
[4]ApacheTomcatの公式から、tomcat8をダウンロードし、解凍。
(eclipseのプロジェクトビルド用)
※適当なローカルフォルダに解凍した。
[5]SAStrutsの公式からチュートリアルの最新zipをダウンロード。
(11年までが最終っぽい。でも、今でもバリバリ現役だからすごい。)
[6]とりあえず、チュートリアルをeclipseにプロジェクトとしてimport
※import直後はライブラリの設定が通ってないのでエラーになっているハズ。
・eclipseでチュートリアルのビルド、WAR作成
[1]ビルドを通すため、eclipseの環境設定のTomcatを設定。
Tomcatのパスは、準備で解凍したTomcatのフォルダを指すようにした。
また、バージョンも8に設定。
設定すると、エラーは出なくなるハズ。
[2]インポートしたチュートリアルのプロジェクトを右クリックし、
「properties」でダイアログ起動し、「Tomcat」選択
WARエクスポート設定を選んで、
WARのパスを設定、「Apply」ボタン -> 「OK」ボタンを押す
[3]再び、プロジェクトを右クリックし、
「Tomcatプロジェクト」->「プロジェクトの設定に従いWARファイルを作成」を選択。
WARが作成され、成功した通知のダイアログが立ち上がる。
pies-no-MacBook-Pro:work pies$ ls -la ~/work/tktk.war
-rw-r--r-- 1 pies staff 12317670 11 26 12:55 /Users/pies/work/tktk.war
pies-no-MacBook-Pro:work pies$
出来てる感じ。
・リモートデバッグするコンテナの準備
[1]準備で作成したイメージを使って、コンテナ起動。
docker run -p 8080:8080 -p 8000:8000 -e JPDA_ADDRESS=8000 -e JPDA_TRANSPORT=dt_socket --name tomcat8tktk -d tomcat8withemacs
※リモートデバッグの為に、ポート8000を追加した
※後述、catalina.shも書き換えるが、環境変数を設定しないと、リモートデバッグが起動しなかったので、環境変数を追加した。
[2]コンテナのシェル起動
docker exec -it tomcat8tktk /bin/bash
※Tomcatの設定を触る為、起動
※以下、ファイルを編集する作業はemacsで行った。
[3]「/usr/local/tomcat/conf/tomcat-users.xml」に設定追加。
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>
※WARをTomcatマネージャーで手動デプロイする為。面倒くさい事はしない。。。
[4]「/usr/local/tomcat/bin/catalina.sh」の「CATALINA_OPTS」の設定部分を変更
以下のブロックで、CATALINA_OPTSを設定しているが、
if [ "$1" = "jpda" ] ; then
・・・
fi
上記、ブロックの直下に、以下を追記して、保存。
# FOR TKTK REMOTE DEBUG
JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
強制的にリモートデバッグを有効にする。
[5]シェルを抜け、コンテナを再起動する。
docker restart tomcat8tktk
・チュートリアルのデプロイと確認
[1]再び、猫画面(http://localhost:8080)を呼び出し、
画面の「Manager App」ボタンをクリック
[2]マネージャ画面へのアクセスなので認証が出る。
「tomcat-users.xml」で追記した、ユーザー・パスを入力してログイン
マネージャー画面が起動。
[3]マネージャー画面の「WAR file to deploy」項で、
「Select WAR file to upload」で作成したWARを設定し、
「Deploy」ボタンを押す。
デプロイ成功。
[4]デプロイしたチュートリアルが起動するか、確認する。
http://localhost:8080/tktk/
にアクセス。
indexは起動。リンク「足し算」を押してみる。
無事、チュートリアルのデプロイは完了。
・チュートリアルのリモートデバッグ
[1]eclipseで、「Debug Configurations」を開き、「Remote Java Application」を選択し、右クリックで「New」を選択。
プロジェクトに、チュートリアルのプロジェクト、
Hostにlocalhost
Portに8000
を指定、「apply」ボタンをクリック後、「Debug」ボタンをクリック。
起動したっぽいけど、よくわからないので、eclipseのビューをDebugに変えてみる。
多分(。。。)、起動している。
[2]足し算をデバッグしてみる。
ビューをJavaに切り替え、「AddAction.java」にブレークポイントを設定。
[3]足し算画面で、入力し、サブミット。
eclipseがブレークポイントに反応するが、
こんなダイアログが、表示される。
(OKを押すと、も1度、出る。。。。orz)
DIのせーかな。。。。
でも、ブレーク自体は失敗せず、
デバッグビューに切り替わり、ブレークポイントの位置で
実行が止まる。
AddActionのインスタンスの中身も見れている。
書き換えてみる。。。
何事もなく、書きかわるw
で、そのまま、ステップオーバーし、ブラウザにレスポンスを返させる。
何事もなく、書き換わったwwww
というわけで、実験終わり。
すんなり、DcokerコンテナのTomcat上のSAStrutsが
リモートデバッグ出来た感じ。。。
JDKやJ2EEのバージョンが、だいーーーぶ先に行っても、
普通に動いてしまうS2やSAStrutsが凄いのかな。。。
Dockerも凄いけど。