Dynamic Web Projectで任意の場所からライブラリを追加する方法

「ビルド職人本」で「Dyanmic Web ProjectのライブラリはwebContent/WEB-INF/libにしか置けない!」なんてドヤ顔で書きましたが、そんなことないってのが分かりました。この場を借りてお詫びと訂正を...。


他のプロジェクト(Java Project)と依存関係を持たせ、そのJava Projectの成果物をwarファイルに含められないのかな?と思ったのが事の発端。


Dynamic Web Project側のソースコードコンパイルできるようにするだけなら、プロジェクトプロパティの"Java Build Path -> Projects"にお目当てのプロジェクトを指定するだけでOK。ただ、それだとwarファイルにそのプロジェクトの成果物(クラスファイルかjarファイル)は含まれないらしく、不完全な状態でデプロイされるようです。


「そんなものできのか!?」と思いつつ、あれこれ探ったところ、プロジェクトプロパティの"Web Deployment Assembly"で設定できるらしい(ちなみに、この項目、ふるいEclipse WTPだと"Java EE Module Dependencies"だったらしいです。よー知らんけど。
具体的には、同設定画面を開き「Add...」ボタンを押して、warファイルに含める内容を設定します。下図のようなダイアログ("New Assembly Directive")から目的に応じたAssemblyを追加します。


Assemblyの種類を簡単にまとめると、

  • jarファイルを追加するなら "Archive via Path Variable", "Archives from File System", "Archives from Workspace"のいずれか
  • 他のプロジェクトを WEB-INF/classes か WEB-INF/lib に含めたいなら "Project"
  • Webコンテンツを追加したいなら "Folder"
  • "Java Build Path Entries" は用途がわかりませんでした。

試しに設定してみたのがこちら。


自身のプロジェクト(sampleWeb)の ./lib/hoge.jar を WEB-INF/lib に追加しているのと、依存プロジェクト(samplePrj)の成果物を WEB-INF/lib/samplePrj.jar としているのがわかると思います(残念なことに、依存プロジェクトのjarファイル名は変更することができませんでした。


わかってしまえば簡単な事ですが、そんなんだったら"Web App Libraries"なんて余計なもの付けてくれんな!と自分のマヌケさを棚に上げてつつイラっときたのはナイショ。:-P
でもまあ、「Eclipseだから webContent/WEB-INF/lib にjarファイル置かなきゃダメ」ってのが制約事項じゃないってのが分かったのは大きな収穫か...。あんま嬉しくないけど。