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 ファイルを
おくことで解決。


ソースを変更

デフォルトで用意されているサーブレットのファイル名を変更し、
簡単なチャートを作るサンプルを入れておく。
サンプルと 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 で提供されていて、
設定らしき物は見当たらない。


このページによると 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 だ。
最終更新:2006年03月19日 01:25
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。