Maven2 Eclipse Plugin 再調査
4月から再びJavaの仕事をやることになったので、開発環境を再度調査しています。
id:da-yoshi:20070421:1177143777の日記で、Maven2 Eclipse PluginによるWTPとの連携を調べましたが、今回改めて調べたところ、より便利になってることがわかりました。
今回書いてみたpom.xmlはこんな感じです。次の仕事がStruts+Spring+Hibernateのシステムなので、この3つのFWをWTP上で使う組み合わせを書いてみました。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springmaven</groupId> <artifactId>springmaven</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>springmaven Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>struts</groupId> <artifactId>struts</artifactId> <version>1.2.9</version> <exclusions> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> <exclusion> <groupId>xalan</groupId> <artifactId>xalan</artifactId> </exclusion> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>3.3.2.GA</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc-struts</artifactId> <version>2.5.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>2.5.2</version> </dependency> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.4</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>springmaven</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <configuration> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> <wtpversion>2.0</wtpversion> <additionalProjectFacets> <sun.facet>9</sun.facet> </additionalProjectFacets> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>java.net</id> <url>http://download.java.net/maven/1</url> <layout>legacy</layout> </repository> <repository> <id>jboss-maven2</id> <url>http://repository.jboss.org/maven2</url> </repository> </repositories> </project>
maven-eclipse-pluginのプラグイン記述をpomに書いてあげることによって、コマンドで長いオプションをつける必要はなくなります。ライブラリの組み合わせをいろいろ変えて再実行したいときに便利です。
調べていてわかったのは、まずmaven-compiler-pluginで利用するJDKのバージョンを指定すること。これによってProject FacetsのJavaバージョンが決定されます。次に、利用するバージョンのServlet APIのjarをdependencyに加えること。これでProject FacetsのDynamic Web Modulesのバージョンが決まります。servlet-apiのjarはGlassFishのリポジトリやGeronimo関連で公開されています。javaee-apiのjarでも試してみましたが、servlet-apiのjarが入ってないと認識してくれないみたいです。その他固有のProjectFacetsも、pomに書いておくことによって自動で定義してくれます。
こんなかんじで記述しておけば、後はライブラリ構成を変更するたびに「mvn eclipse:clean eclipse:eclipse」とコマンド入力すれば大丈夫。Maven2でライブラリ管理しつつ、WTPによるAPサーバとの連携機能を十分に使うことが出来ます。
今回は調べていませんが、earプロジェクトをターゲットにした連携もサポートしているみたいですね。機会があれば試してみたいと思います。
id:da-yoshi:20070426:1177550114で書いた、Maven2の推移的依存関係の問題は、最新バージョンでも特に変わっていないみたいです。今回の例でも、commons-loggingの定義が複数FWで被っており、古いバージョンのjarがダウンロードされてしまいました。依存関係を自分で調べて、不必要な依存関係は自分でexclusionの定義を書かなければいけない・・・という注意点は変わってないみたいですね。
SpringのJPA連携機能
せっかくSpringに触ったので、JPA連携機能を少し調べてみました。
どうやら、org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessorというクラスがポイントっぽいですね。このクラスを登録し、更にweb.xmlでPersistenceUnitのJNDI定義を書いておけば、あとはEJB3でJPAを利用するのと同じ感覚で管理されたEntityManagerを利用できるみたいです(ただし、複数PersistenceUnitを利用する場合、unitNameと登録beanのIDをあわせておく必要があるみたい)。これはなかなか便利。EJB3が事実上JSF1.2上でしかまともに使えないのに比べ、SpringのJPAサポートはほぼ同じ感覚でStruts等の連携可能なFW上で利用することができます。Seasar2も同じことは出来るのですが、JPA実装用のライブラリが個別に必要になるのと、Seasar2独自の設定方法を色々と覚えないと利用し辛いのが欠点でしょうか・・・
上記の例は、JavaEE5サーバのJPAを使う場合ですが、Tomcatのようなサーブレットコンテナ上で管理されたEntityManagerを利用する為の機能も用意されているみたいです。これは次回にでも試してみたいと思います。
JpaSupportとかJpaTemplateとかいう、JPAを便利に使えるらしいユーティリティも用意されてます。うーん・・・これは正直、どこが便利なのか全然解りませんでした(汗)JPAのAPIを完全に隠蔽してしまっているのですが、JPAに比べて特に便利な機能を提供しているわけでもないっぽい。パラメータをMapで受け取れるところくらい? ・・・でも、検索で沢山のパラメータ使うときはCriteria機能をHibernate Native APIで呼び出すとかしないと駄目だろうし、登録・更新系ならEntityに値を入れるから、あまりありがたみは感じません。JPAの売りの一つである、Queryによる流れるようなインターフェイス記述もできなくなってしまいます。Hibernateの頃から、Springはこういう機能を売りにしてるみたいですけど、個人的にはこの機能は使いたくないなぁ(汗)まぁ、使いたくなければ使わなくて大丈夫というのが、Springの良いところなんですけど。