「Maven + JFreeChart」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
* Maven + JfreeChart Servlet
** 環境構築
maven genapp
type=web
*** build.xml に jfreechart を登録
<dependency>
<id>jfreechart</id>
<version>1.0.1</version>
</dependency>
このままではダウンロードに失敗する。リモートレポジトリを探しても
よいが、面倒なのでローカルレポジトリに
jfreechart/jars/jfreechart-1.0.1.jar というパスで jar ファイルを
おくことで解決。
つぎは jelly だ。
*** ソースを変更
デフォルトで用意されているサーブレットのファイル名を変更し、
簡単なチャートを作るサンプルを入れておく。
サンプルと jfreechart の版が異なるためか、import に関してエラーが
発生。jar ファイルを調べるとパッケージが変わっていることがわかり、
ソースを修正
*** web.xml
ビルド過程で web.xml が生成されているが、build.xml には明示的な
指定が見当たらない。タイプが web の場合には XDoclet を使用する
様になっているらしいので Servlet class の javadoc 部分に次の
行を追加
* @web.servlet name="ChartServlet"
* @web.servlet-mapping url-pattern="/ChartServlet"
mave jar の結果次の行が web.xml に現れた。
<servlet>
<servlet-name>ChartServlet</servlet-name>
<servlet-class>yt.web.ChartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChartServlet</servlet-name>
<url-pattern>/ChartServlet</url-pattern>
</servlet-mapping>
** war ファイルの作成
ビルドには maven jar で jar ファイルを作っていたが JBoss に
インストールするには war でないと(多分)だめ。これは
maven war で作成された。
** deploy
war ファイルを JBoss の deploy ディレクトリにコピーする。
23:48:49,068 INFO [TomcatDeployer] deploy, ctxPath=/jfcserv, warUrl=.../tmp/dep
loy/tmp33342jfcserv-exp.war/
23:48:51,740 INFO [JBossCacheManager] init(): replicationGranularity_ is 0 and
invaldateSessionPolicy is 2
23:48:51,818 ERROR [JBossCacheManager] JBossCacheService to Tomcat clustering no
t found
23:48:51,818 ERROR [TomcatDeployer] Failed to setup clustering, clustering disab
led
Clustering に関するメッセージが出ている。web.xml に何か cluster を
要求する記述があるのかもしれない。ここでは気にせず、実行に進む。
** 実行
localhost:8080/jfcserv にアクセスすると sample.jsp のディレクトリ
リストが表示されるのみ
localhost:8080/ChartServlet ではエラー(Status 404) になるため
localhost:8080/jfcserv/ChartServlet をトライ
1回目はエラーが表示され、2回目からは 404 となる。これは CharServlet
が disable されたため
23:49:51,802 INFO [[/jfcserv]] Marking servlet ChartServlet as unavailable
23:49:51,880 ERROR [[ChartServlet]] Allocate exception for servlet ChartServlet
java.lang.NoClassDefFoundError: org/jfree/data/general/PieDataset
war ファイルを見てみると WEB-INF/lib に jfreechart の jar ファイルが
ない。本を見ると build.xml の変更が必要らしい。
** war ファイルにライブラリを含める
war.bundle プロパティを true にするとそのライブラリは war に含まれる。
<dependency>
<id>jfreechart</id>
<version>1.0.1</version>
<properties>
<war.bundle>true</war.bundle>
</properties>
</dependency>
再ビルド後実行してみるとエラーが変わった。
java.lang.NoClassDefFoundError: org/jfree/util/PublicCloneable
** ライブラリを追加
PublicClonable は jcommon-1.0.0.jar に入っている。
jcommon/jars/jcommon-1.0.0.jar
というエントリをローカルレポジトリに用意すればよさそうだが、
これで良いのか疑問がわく。なぜならこのライブラリは jfreechart
の一部だからだ。レポジトリ以下の構成は
${groupId}/${type}s/${artifactId}-${version}.${type}
なので次要領ででトライ.
- jfreechart/jars/jcommon-1.0.0.jar を作成
- 次のエントリを project.xml に用意
<dependency>
<groupId>jfreechart</groupId>
<artifactId>jcommon</artifactId>
<version>1.0.0</version>
<properties>
<war.bundle>true</war.bundle>
</properties>
</dependency>
ビルド、デプロイ、実行。グラフが表示できた。
** マッピングの変更
* @web.servlet name="ChartServlet"
* @web.servlet-mapping url-pattern="/chart.jpg"
localhost:8080/jfcserv/chart.jpg でチャートが表示される。
当然、以前のパスでは 404 になる。
** Clustering エラー
00:40:45,771 ERROR [JBossCacheManager] JBossCacheService to Tomcat clustering no
t found
00:40:45,771 ERROR [TomcatDeployer] Failed to setup clustering, clustering disab
led
web.xml に distributable タグを発見。これを消すことで解決
<web-app >
<!--
<distributable/>
-->
しかし、web.xml は XDoclet が動的に生成しているため、元となっている
設定あるいはテンプレートがあるはず...
プロジェクト以下のファイルを探しても、それらしき物は見つからない。
ローカルレポジトリにも見つからない。
Googleで探すと ant の場合、次のような指定で出来るようである。
<deploymentdescriptor distributable="false" />
maven.xml を見ると次のエントリで xdoclet を起動しているようだ。
<project xmlns:j="jelly:core" xmlns:ant="jelly:ant" default="war">
<preGoal name="java:compile">
<mkdir dir="${maven.build.dir}/xdoclet/webdoclet/WEB-INF" />
<attainGoal name="xdoclet:webdoclet" />
</preGoal>
</project>
レポジトリを見ると xdoclet plugin は jar で提供されていて、
設定らしき物は見当たらない。
http://xdoclet.sourceforge.net/xdoclet/maven-plugin.html
このページによると maven xdoclet プラグインはプロパティで
ある程度動作が制御できるようだ。
maven xdoclet plugin jar ファイルを展開すると plugin.properties
があるが、distributable に関する物はない。
plugin.jelly には次の様な記述がある。
<j:set var="prop_name" value="maven.xdoclet.webdoclet.deploymentdescriptor.${subelement_index}.distributable"/>
<jelant:setProperty name="distributable" value="${context.getVariable(prop_name)}"/>
project.properties に次の1行を追加
maven.xdoclet.webdoclet.deploymentdescriptor.0.distributable=false
XDoclet が走るようサーブレットソースをタッチして再ビルド。
狙い通り <distributable/> が消えた。
* Maven + JfreeChart Servlet
** 環境構築
maven genapp
type=web
*** build.xml に jfreechart を登録
<dependency>
<id>jfreechart</id>
<version>1.0.1</version>
</dependency>
このままではダウンロードに失敗する。リモートレポジトリを探しても
よいが、面倒なのでローカルレポジトリに
jfreechart/jars/jfreechart-1.0.1.jar というパスで jar ファイルを
おくことで解決。
*** ソースを変更
デフォルトで用意されているサーブレットのファイル名を変更し、
簡単なチャートを作るサンプルを入れておく。
サンプルと jfreechart の版が異なるためか、import に関してエラーが
発生。jar ファイルを調べるとパッケージが変わっていることがわかり、
ソースを修正
*** web.xml
ビルド過程で web.xml が生成されているが、build.xml には明示的な
指定が見当たらない。タイプが web の場合には XDoclet を使用する
様になっているらしいので Servlet class の javadoc 部分に次の
行を追加
* @web.servlet name="ChartServlet"
* @web.servlet-mapping url-pattern="/ChartServlet"
mave jar の結果次の行が web.xml に現れた。
<servlet>
<servlet-name>ChartServlet</servlet-name>
<servlet-class>yt.web.ChartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChartServlet</servlet-name>
<url-pattern>/ChartServlet</url-pattern>
</servlet-mapping>
** war ファイルの作成
ビルドには maven jar で jar ファイルを作っていたが JBoss に
インストールするには war でないと(多分)だめ。これは
maven war で作成された。
** deploy
war ファイルを JBoss の deploy ディレクトリにコピーする。
23:48:49,068 INFO [TomcatDeployer] deploy, ctxPath=/jfcserv, warUrl=.../tmp/dep
loy/tmp33342jfcserv-exp.war/
23:48:51,740 INFO [JBossCacheManager] init(): replicationGranularity_ is 0 and
invaldateSessionPolicy is 2
23:48:51,818 ERROR [JBossCacheManager] JBossCacheService to Tomcat clustering no
t found
23:48:51,818 ERROR [TomcatDeployer] Failed to setup clustering, clustering disab
led
Clustering に関するメッセージが出ている。web.xml に何か cluster を
要求する記述があるのかもしれない。ここでは気にせず、実行に進む。
** 実行
localhost:8080/jfcserv にアクセスすると sample.jsp のディレクトリ
リストが表示されるのみ
localhost:8080/ChartServlet ではエラー(Status 404) になるため
localhost:8080/jfcserv/ChartServlet をトライ
1回目はエラーが表示され、2回目からは 404 となる。これは CharServlet
が disable されたため
23:49:51,802 INFO [[/jfcserv]] Marking servlet ChartServlet as unavailable
23:49:51,880 ERROR [[ChartServlet]] Allocate exception for servlet ChartServlet
java.lang.NoClassDefFoundError: org/jfree/data/general/PieDataset
war ファイルを見てみると WEB-INF/lib に jfreechart の jar ファイルが
ない。本を見ると build.xml の変更が必要らしい。
** war ファイルにライブラリを含める
war.bundle プロパティを true にするとそのライブラリは war に含まれる。
<dependency>
<id>jfreechart</id>
<version>1.0.1</version>
<properties>
<war.bundle>true</war.bundle>
</properties>
</dependency>
再ビルド後実行してみるとエラーが変わった。
java.lang.NoClassDefFoundError: org/jfree/util/PublicCloneable
** ライブラリを追加
PublicClonable は jcommon-1.0.0.jar に入っている。
jcommon/jars/jcommon-1.0.0.jar
というエントリをローカルレポジトリに用意すればよさそうだが、
これで良いのか疑問がわく。なぜならこのライブラリは jfreechart
の一部だからだ。レポジトリ以下の構成は
${groupId}/${type}s/${artifactId}-${version}.${type}
なので次要領ででトライ.
- jfreechart/jars/jcommon-1.0.0.jar を作成
- 次のエントリを project.xml に用意
<dependency>
<groupId>jfreechart</groupId>
<artifactId>jcommon</artifactId>
<version>1.0.0</version>
<properties>
<war.bundle>true</war.bundle>
</properties>
</dependency>
ビルド、デプロイ、実行。グラフが表示できた。
** マッピングの変更
* @web.servlet name="ChartServlet"
* @web.servlet-mapping url-pattern="/chart.jpg"
localhost:8080/jfcserv/chart.jpg でチャートが表示される。
当然、以前のパスでは 404 になる。
** Clustering エラー
00:40:45,771 ERROR [JBossCacheManager] JBossCacheService to Tomcat clustering no
t found
00:40:45,771 ERROR [TomcatDeployer] Failed to setup clustering, clustering disab
led
web.xml に distributable タグを発見。これを消すことで解決
<web-app >
<!--
<distributable/>
-->
しかし、web.xml は XDoclet が動的に生成しているため、元となっている
設定あるいはテンプレートがあるはず...
プロジェクト以下のファイルを探しても、それらしき物は見つからない。
ローカルレポジトリにも見つからない。
Googleで探すと ant の場合、次のような指定で出来るようである。
<deploymentdescriptor distributable="false" />
maven.xml を見ると次のエントリで xdoclet を起動しているようだ。
<project xmlns:j="jelly:core" xmlns:ant="jelly:ant" default="war">
<preGoal name="java:compile">
<mkdir dir="${maven.build.dir}/xdoclet/webdoclet/WEB-INF" />
<attainGoal name="xdoclet:webdoclet" />
</preGoal>
</project>
レポジトリを見ると xdoclet plugin は jar で提供されていて、
設定らしき物は見当たらない。
http://xdoclet.sourceforge.net/xdoclet/maven-plugin.html
このページによると maven xdoclet プラグインはプロパティで
ある程度動作が制御できるようだ。
maven xdoclet plugin jar ファイルを展開すると plugin.properties
があるが、distributable に関する物はない。
plugin.jelly には次の様な記述がある。
<j:set var="prop_name" value="maven.xdoclet.webdoclet.deploymentdescriptor.${subelement_index}.distributable"/>
<jelant:setProperty name="distributable" value="${context.getVariable(prop_name)}"/>
project.properties に次の1行を追加
maven.xdoclet.webdoclet.deploymentdescriptor.0.distributable=false
XDoclet が走るようサーブレットソースをタッチして再ビルド。
狙い通り <distributable/> が消えた。
つぎは jelly だ。