[実験]DockerコンテナでSAStrutsのチュートリアルをリモートデバッグしてみる



久しぶりにStrutsの事聞かれたので、Dockerでtomcatを動かして、SAStrutsのチュートリアルをデプロイして
デバッガが動くところまで、試してみた。（聞かれた事とは全く関係なかったりする）
ちなみに、もう１０年くらい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で昔よく見た汚い猫画像を確認。。。

![dartycat.png](https://qiita-image-store.s3.amazonaws.com/0/38889/93794b07-f646-1847-12d0-8dcd51c65192.png "dartycat.png")


多分、コンテナの設定ファイルを触るので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に設定。

![eclipse_setting_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/29dfd295-a67f-a019-3f67-3789103e2c22.png "eclipse_setting_1.png")

設定すると、エラーは出なくなるハズ。

[2]インポートしたチュートリアルのプロジェクトを右クリックし、
「properties」でダイアログ起動し、「Tomcat」選択

![eclipse_setting_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/4a68f012-8eb0-33ea-ec06-edf86efcf877.png "eclipse_setting_2.png")

WARエクスポート設定を選んで、

![eclipse_setting_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/ddd0cf35-1ccb-93ce-ac59-5093fd3aa1c0.png "eclipse_setting_2.png")

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」ボタンをクリック

![tomcat_deploy_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/eda905dd-8c8a-6b5e-a21a-afb5febfeceb.png "tomcat_deploy_1.png")

[2]マネージャ画面へのアクセスなので認証が出る。

![tomcat_deploy_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/4f507fee-e577-ea1e-16c7-fd89347466ba.png "tomcat_deploy_2.png")

「tomcat-users.xml」で追記した、ユーザー・パスを入力してログイン

![tomcat_deploy_3.png](https://qiita-image-store.s3.amazonaws.com/0/38889/b406b067-6d36-61c2-8975-18becdbe15f4.png "tomcat_deploy_3.png")

マネージャー画面が起動。

[3]マネージャー画面の「WAR file to deploy」項で、
「Select WAR file to upload」で作成したWARを設定し、

![tomcat_deploy_4.png](https://qiita-image-store.s3.amazonaws.com/0/38889/6c45b1e3-819e-31a7-3653-eb75edeb8464.png "tomcat_deploy_4.png")

「Deploy」ボタンを押す。

![tomcat_deploy_5.png](https://qiita-image-store.s3.amazonaws.com/0/38889/d43a42fe-c2c3-8842-6a7d-a57c338d3d60.png "tomcat_deploy_5.png")


デプロイ成功。

[4]デプロイしたチュートリアルが起動するか、確認する。
http://localhost:8080/tktk/
にアクセス。

![スクリーンショット 2016-11-26 14.07.56.png](https://qiita-image-store.s3.amazonaws.com/0/38889/efbd2326-07d4-5598-a00c-6b99a58394f8.png "スクリーンショット 2016-11-26 14.07.56.png")

indexは起動。リンク「足し算」を押してみる。

![tomcat_deploy_7.png](https://qiita-image-store.s3.amazonaws.com/0/38889/dcd569ac-5c8f-3977-f22b-6af5c4038168.png "tomcat_deploy_7.png")

無事、チュートリアルのデプロイは完了。


・チュートリアルのリモートデバッグ

[1]eclipseで、「Debug Configurations」を開き、「Remote Java Application」を選択し、右クリックで「New」を選択。

![tomcat_remote_debug_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/fdf1c098-1404-470c-1a28-4bfbe33354f9.png "tomcat_remote_debug_1.png")

プロジェクトに、チュートリアルのプロジェクト、
Hostにlocalhost
Portに8000
を指定、「apply」ボタンをクリック後、「Debug」ボタンをクリック。

起動したっぽいけど、よくわからないので、eclipseのビューをDebugに変えてみる。

![tomcat_remote_debug_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/c59927d7-fed1-b642-9dbc-1b7db7991aa1.png "tomcat_remote_debug_2.png")


多分（。。。）、起動している。


[2]足し算をデバッグしてみる。
ビューをJavaに切り替え、「AddAction.java」にブレークポイントを設定。

![tomcat_remote_debug_3.png](https://qiita-image-store.s3.amazonaws.com/0/38889/98772420-cbda-d44c-43ba-c76ebd4abee3.png "tomcat_remote_debug_3.png")

[3]足し算画面で、入力し、サブミット。

![tomcat_remote_debug_4.png](https://qiita-image-store.s3.amazonaws.com/0/38889/b985ee8b-fde1-4265-1db8-56938c559584.png "tomcat_remote_debug_4.png")


eclipseがブレークポイントに反応するが、

![tomcat_remote_debug_5.png](https://qiita-image-store.s3.amazonaws.com/0/38889/3d349a6d-1140-b19e-97d1-546ff86fcc0e.png "tomcat_remote_debug_5.png")


こんなダイアログが、表示される。
（OKを押すと、も１度、出る。。。。orz）

DIのせーかな。。。。

でも、ブレーク自体は失敗せず、
デバッグビューに切り替わり、ブレークポイントの位置で
実行が止まる。

![tomcat_remote_debug_6.png](https://qiita-image-store.s3.amazonaws.com/0/38889/661e71e8-9bfb-94d3-a52f-3900b23505a9.png "tomcat_remote_debug_6.png")


AddActionのインスタンスの中身も見れている。

![tomcat_remote_debug_7.png](https://qiita-image-store.s3.amazonaws.com/0/38889/f0f8b314-c829-271a-7512-38fd5ec3d493.png "tomcat_remote_debug_7.png")


書き換えてみる。。。

![tomcat_deploy_8.png](https://qiita-image-store.s3.amazonaws.com/0/38889/4581b28b-a5cc-7cdd-9b0a-05a41316c96c.png "tomcat_deploy_8.png")

ステップ実行し、計算。
![tomcat_deploy_9.png](https://qiita-image-store.s3.amazonaws.com/0/38889/9debb957-c5cd-2a76-2eaf-8142fb321c2b.png "tomcat_deploy_9.png")

何事もなく、書きかわるw
で、そのまま、ステップオーバーし、ブラウザにレスポンスを返させる。

![tomcat_remote_debug_10.png](https://qiita-image-store.s3.amazonaws.com/0/38889/0e6d6710-6374-20fc-eceb-facd80bba1e9.png "tomcat_remote_debug_10.png")

何事もなく、書き換わったwwww


というわけで、実験終わり。

すんなり、DcokerコンテナのTomcat上のSAStrutsが
リモートデバッグ出来た感じ。。。

JDKやJ2EEのバージョンが、だいーーーぶ先に行っても、
普通に動いてしまうS2やSAStrutsが凄いのかな。。。
Dockerも凄いけど。