OpenJPAのビルドタイムエンハンサをantからコールする
JPAのエンティティクラスはエンハンスされていないと使えない。
コンパイル後(実行前)に classファイルを書き換えてしまうのがビルドタイムエンハンス
実行中にリアルタイムでクラスをエンハンスするのがランタイムエンハンス
Eclipseで開発作業をしているときにはランタイムエンハンスが便利。OpenJPAの場合、Java VMに -javaagent:/path/to/openjpa.jar オプションを与えてやることでランタイムエンハンスが有効になる。
しかし warファイルを作って Tomcatにデプロイしようとしたとき、どうしてもランタイムエンハンスをうまく適用させることが出来なかった(JAVA_OPTS環境変数に -javaagentをセットするとTomcatが起動しない・・・)
仕方ないので antのタスクでビルドタイムエンハンスをすることにした。OpenJPAでは、ビルドタイムエンハンス用のAntタスクが提供されている。
コンパイルの後、パッケージングの前に
エンハンス対象となるクラスを特定するため、persistence.xmlの persistence-unit内に class要素を羅列しておく必要がある(これはランタイムエンハンスの場合でも実行時間を短縮するために有用)。
これでアプリケーションサーバに特別な設定をすることなく OpenJPAを使った Webアプリケーションがデプロイできるようになった。
コンパイル後(実行前)に classファイルを書き換えてしまうのがビルドタイムエンハンス
実行中にリアルタイムでクラスをエンハンスするのがランタイムエンハンス
Eclipseで開発作業をしているときにはランタイムエンハンスが便利。OpenJPAの場合、Java VMに -javaagent:/path/to/openjpa.jar オプションを与えてやることでランタイムエンハンスが有効になる。
しかし warファイルを作って Tomcatにデプロイしようとしたとき、どうしてもランタイムエンハンスをうまく適用させることが出来なかった(JAVA_OPTS環境変数に -javaagentをセットするとTomcatが起動しない・・・)
仕方ないので antのタスクでビルドタイムエンハンスをすることにした。OpenJPAでは、ビルドタイムエンハンス用のAntタスクが提供されている。
build.xmlに加えた内容
コンパイルの後、パッケージングの前に
<taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask">
<classpath>
<fileset dir="OpenJPAや依存jarが入っているディレクトリ" includes="*.jar"/>
<pathelement location="対象クラス及びMETA-INF/persistence.xmlを含むクラスパス"/>
</classpath>
</taskdef>
<openjpac />
エンハンス対象となるクラスを特定するため、persistence.xmlの persistence-unit内に class要素を羅列しておく必要がある(これはランタイムエンハンスの場合でも実行時間を短縮するために有用)。
これでアプリケーションサーバに特別な設定をすることなく OpenJPAを使った Webアプリケーションがデプロイできるようになった。
ラベル: OpenJPA

0 件のコメント:
コメントを投稿
<< ホーム