文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

eclipseでJava ProjectをDynamic Web Projectに変更してプロジェクトに親子関係を持たせる

レガシープロジェクトで必要になったりするので、要チェックです!


f:id:treeapps:20180426142529p:plain

eclipseでサンプルプロジェクトをインポートした際にjavaプロジェクトだが、これを後から動的プロジェクト(Dynamic Web Project)に変更し、更にプロジェクトに親子関係を持たせる方法を紹介します。

昔作った古いプロジェクトが動的webプロジェクトになっておらず、WTPの設定が面倒だったりするので、動的webプロジェクト化しておきたいですね。

※ 私は基本的にIDEは全て英語環境なので英語で記述します。

動的プロジェクト化する手順

通常のjavaプロジェクトを用意する

こんな感じでプロジェクトがあったとします。
f:id:treeapps:20140508233830p:plain

javaプロジェクトのプロパティを見ると、こんな感じで大分設定項目が少ないです。
f:id:treeapps:20140508234420p:plain

project facetsを設定する

dynamic web project化するには、project facetsを設定する必要があります。
初期状態では以下のような画面が表示されるので、「Convert to faceted from...」をクリックします。
f:id:treeapps:20140508234630p:plain

続いて、「Dynamic Web Module」のチェックボックスをONにします。
f:id:treeapps:20140508235014p:plain

これだけでDynamic Web Project化ができます。
f:id:treeapps:20140508235645p:plain

Dynamic Web Projectの場合、servers(WTP)作成時に候補として表示されるようになります。通常のJava Projectの場合は候補として表示されません。
f:id:treeapps:20140508235958p:plain

先ほどの画像で「Deployment Assembly」という設定項目がありました。
実はこの設定がプロジェクトに親子関係を持たせる設定の1つなのです。このDeployment AssemblyはDynamic Web Projectを設定した際に設定できます。

プロジェクトに親子関係を持たせる

親子関係とは、例えば

parent-project/
├── admin-project
└── front-project

こんな感じの関連を持たせる事です。
親プロジェクトにfrontとadmin共通で使う定数クラス・ユーティリティークラス等を配置し、複数プロジェクトで共有する事ができます。

注意点として、親プロジェクトはDynamic Web Projectでなくていい点です。Dynamic Web Project化する必要があるのは子プロジェクト側です。親プロジェクトは通常のJava Projectでよいです。

子プロジェクトのビルドパスに親プロジェクトを追加する

frontとadminの両プロジェクトに、親プロジェクトへのパスを通します。
プロジェクトを右クリック→Properties→Projectsタブを選択→Addボタン押下して親プロジェクトを選択、とします。この作業を全子プロジェクトで行って下さい。
f:id:treeapps:20140509002717p:plain
これでfront・adminプロジェクトから、親プロジェクトにあるHigeUtilを呼び出す事ができ、ビルドも可能となります。
f:id:treeapps:20140509003917p:plain

これで子プロジェクトから親プロジェクトの共有クラスが参照でき、frontとadminで同じクラスを用意する必要が無くなりましたね!


やったぜ。


実はまだ足りないんだなこれが


普通にmainメソッド実行できるけど、何か足りないの?

Deployment Assemblyを設定する

実はビルドパスを通すだけではダメです。
eclipse上ではコンパイルできてますが、warファイルをサーブレットコンテナでロードする際に困るのです。理由は簡単。war化すると親子関係の設定が無くなるからです。warになると.classpathファイルや.settingsフォルダ等の設定は意味を無さなくなるので、tomcat起動時にClassNotFoundException(親プロジェクトのクラスが見つからない)が発生します。なんせパスが通ってないのですから。

そこで登場するのがDeployment Assemblyです。
これを設定すると、親プロジェクトをjar化し、子プロジェクトのlibに自動配置してくれます。jar化してあればwarになってもjar経由で親プロジェクトのクラスが参照できるようになる訳です

プロジェクトを右クリック→Properties→Deployment Assembly→Addボタンを押下してProjectを選択してNextボタン押下→親プロジェクトを選択してFinishボタンを押下します。
f:id:treeapps:20140509005002p:plain
全子プロジェクトでDeployment Assemblyを設定して下さい。
設定すると、以下のようにWeb App Librariesが自動で追加され、その中に自動で親プロジェクトが設定されます。
f:id:treeapps:20140509010043p:plain


おめでとうございます!これでプロジェクトに親子関係を持たせる事ができました!!

雑感

mavevではmavenの設定ファイルに親子を設定すれば、自動的にこの作業をやってくれるようです。
maven・gradleを使っていないantでゴリゴリ系の古いプロジェクトで親子関係を持たせたい場合は、このように手動で設定するといいかと思います。

たまに親プロジェクトをantでjar化し、子のlibに出力するような手動でjarをゴリゴリ系プロジェクトを見ますが、もう最悪です。共通クラスを変更する度に手動でjarを生成し直すという無駄な作業が延々と続きます・・・

そうならないためにも是非プロジェクトに親子関係を持たせましょう!


担当している古い保守プロジェクトがまさに手動でjarをゴリゴリ系プロジェクトなんだよなあ・・・親子関係を持たせたいけど親から子を参照してたりして、もう手遅れなんだよなあ・・・


・・・そのうちいいことあるさ・・・きっと・・・

・・・gradleを導入して気分転換しような・・・