この文書では、Apache Forrestについて個人的に調べた結果を並べています。 この文書は技術的に正確であることを意図して書いてはいますが、どこかで大嘘をついていたり、 もっと有効な方法があることを見逃していたり、経年により陳腐化しているかもしれません。 私の理解の最前線を書いているようなものなので必ずしもわかりやすくはないかもしれません。
最初のチュートリアルである、 Explanation and features によれば、
>forrest seed >forrest
を、実行しなさいということになっています。しかし >forrest の時点で例外のスタックトレースが 大量に出てきます。 (参考:Forrest のメーリングリスト) まずこれを何とかします。
java.lang.NullPointerException at org.apache.cocoon.environment.AbstractEnvironment.release(AbstractEnvironment.java:563) at org.apache.cocoon.environment.wrapper.MutableEnvironmentFacade.release(MutableEnvironmentFacade.java:314) at org.apache.cocoon.generation.FileGenerator.recycle(FileGenerator.java:64) at org.apache.avalon.excalibur.pool.InstrumentedResourceLimitingPool.put(InstrumentedResourceLimitingPool.java:407) at org.apache.avalon.excalibur.component.PoolableComponentHandler.doPut(PoolableComponentHandler.java:212) at org.apache.avalon.excalibur.component.ComponentHandler.put(ComponentHandler.java:425) at org.apache.avalon.excalibur.component.ExcaliburComponentSelector.release(ExcaliburComponentSelector.java:307) at org.apache.cocoon.components.ExtendedComponentSelector.release(ExtendedComponentSelector.java:301) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.recycle(AbstractProcessingPipeline.java:723) at org.apache.cocoon.components.pipeline.impl.BaseCachingProcessingPipeline.recycle(BaseCachingProcessingPipeline.java:78) at org.apache.cocoon.components.pipeline.impl.AbstractCachingProcessingPipeline.recycle(AbstractCachingProcessingPipeline.java:1130) at org.apache.avalon.excalibur.pool.InstrumentedResourceLimitingPool.put(InstrumentedResourceLimitingPool.java:407) at org.apache.avalon.excalibur.component.PoolableComponentHandler.doPut(PoolableComponentHandler.java:212) at org.apache.avalon.excalibur.component.ComponentHandler.put(ComponentHandler.java:425) at org.apache.avalon.excalibur.component.ExcaliburComponentSelector.release(ExcaliburComponentSelector.java:307) at org.apache.cocoon.components.ExtendedComponentSelector.release(ExtendedComponentSelector.java:301) at org.apache.cocoon.components.EnvironmentDescription.release(CocoonComponentManager.java:695) at org.apache.cocoon.components.CocoonComponentManager.endProcessing(CocoonComponentManager.java:262) at org.apache.cocoon.Cocoon.process(Cocoon.java:739) at org.apache.cocoon.bean.CocoonWrapper.getPage(CocoonWrapper.java:514) at org.apache.cocoon.bean.CocoonBean.processTarget(CocoonBean.java:499) at org.apache.cocoon.bean.CocoonBean.process(CocoonBean.java:356) at org.apache.cocoon.Main.main(Main.java:321)
手っ取り早く直したい人は、
このjarファイルを %FORREST_HOME%\lib\core\
置いてください。
cocoon.2.1.12-dev.jarは、拡張子を適当に変えてforrestからロードされないようにしてください。
これで、例外がスローされることなく普通に実行できるようになります。
疑り深い人向け。 このjarは、Cocoon2.1.11のソースにちょっと手を入れてビルドすれば作れます。
\src\java\org\apache\cocoon\environment\AbstractEnvironment.java
の562行目付近で、
nullのチェックを入れる。
public void release(final org.apache.excalibur.source.Source source) { if (null != source) { this.sourceResolver.release(source); } }
public void release(final org.apache.excalibur.source.Source source) { if (null != source && this.sourceResolver != null ) { this.sourceResolver.release(source); } }
「こんな修正で大丈夫か?」という向きもあると思いますが、動作優先ということで。
>forrest seed が出来たらコンテンツのひな形が出力されます。 作業フォルダの \src\documentation\content\xdocs 配下のxmlをどんどん編集したいのですが、 日本語を入力する時はもうひとつ設定が必要です。
%FORREST_HOME%\main\targets\site.xml 最後のほう(version0.9なら255行目付近)の、 fixcrlfタスクに、encoding="UTF-8"という属性を追加してください。 UTF-8としていますが、実際に本文に使うエンコーディングを属性値にする必要があります。 今時ならばUTF-8で問題ないでしょう。 これで、文字化けなく普通に >forrest が実行できるようになります。
<fixcrlf srcdir="${project.site-dir}" encoding="UTF-8"> <!-- ここにencoding属性を追加 -->
<include name="**/*.html"/>
<!-- The CSS Includes are a workaround for FOR-925 -->
<include name="**/*.css"/>
</fixcrlf>
本文のHTMLは化けなくなりますが、生成されるPDFは化けたままです。(フォントの情報がない?) これはまたおいおい調べる予定。
この 作品 は クリエイティブ・コモンズ 表示 2.1 日本
ライセンスの下に提供されています。
作者: Fukuhara Kazuro.