JBOSSとSeasarとTeeda その1

WebLogic+Seasar2+Teeda+JDK1.5(JRockit)という環境か
JBOSS AS7.2+JDK1.7に移行することになりましたが問題多発です。
備忘録も兼ねて数回に分けてやったことを書いておこうと思います。

まずSeasar2ですが、
開発が止まっているプロダクトということもあり
JBOSS AS7.xそのままでは動きません。

JBOSSのAS5以前では内部のリソース管理に
vfsfile、vfszipというプロトコルを使っているようで
Seasar2もこのプロトコルには対応してますが
AS5移行ではこれがvfsというプロトコルに変更されているので
S2Containerがコンポーネントの自動登録をする際に失敗します。

http://ml.seasar.org/archives/seasar-dev/2013-July/001254.html
http://tech-sketch.jp/2012/09/sastrutsjbossas7.html

上記のサイトに解決方法が書かれており
解決する為の追加jarファイルと設定がありますが
AS7.0ではこれで良かったと思うんですが、これではダメ。
jarファイルの中にあるクラスを自動登録しようとするとエラーになります。

上記のサイトで公開されている
org.seasar.framework.util.VFSResourcesFactoryの中に
以下のコードがあります。

if (url.getPath().toLowerCase().endsWith(".jar/")) {
return handleJar(physicalURI, rootPackage, rootDir);
} else {
return handleDir(physicalURI, rootPackage, rootDir);
})

リソースがファイルなのかjarファイルなのか判定して
分岐している個所があるのですが、
AS7.2では【{JBOSS_HOME}/standalone/tmp/vfs/deploymentxxxxxx/xxx.jar/contents/zzz/】のように
.jarの後にPATHが続きます。
なので後方一致の個所を部分一致に直すなど対策が必要。
# もう1個所同じ判定があります。

また、

private Resources handleJar(URI physicalURI, final String rootPackage,
final String rootDir) throws IOException {
File f = new File(physicalURI);
File[] jar = f.getParentFile().listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".jar");
}
});

ここのphysicalURIという変数の値は
【file:/{JBOSS_HOME}/standalone/tmp/vfs/deploymentxxxxxx/xxx.jar/contents/zzz/】
という値になっているのでfile:とかcontents以降とかを消さないと
ファイルが見つからないエラーになります。

修正してJbossの依存jar追加してコンパイル・・・なので
面倒くさいけどしょうがない。

まだまだJBOSSトラップは続きます。

JBoss Enterprise Application Platform6 構築・運用パーフェクトガイド

JBoss Enterprise Application Platform6 構築・運用パーフェクトガイド