(注:このブログはもう更新していません)この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

[クラウド帳票エンジンDocurain]

struts-2.2.3のxworkにハマった

これを書いている時点では公式ページの告知は無いが、struts-2.2.3がリリースされている。
Mavenリポジトリには既に最新版が配置済みのようで、Ivyで全ての依存関係を更新したらjarが落ちてきた。


しかしこのstruts-2.2.3、ちょっとクセがあるようで、Webアプリが起動しなくなってしまった。。。

調べてみたところ

スタックトレースがドバーッとでる。

2011-05-06 19:10:49,904 ERROR [ClassFinder] Thread-2 - Unable to read class [foo.Bar]
java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/finder/ClassFinder$InfoBuildingVisitor
	at com.opensymphony.xwork2.util.finder.ClassFinder.readClassDef(ClassFinder.java:780) ~[xwork-core-2.2.3.jar:2.2.3]
	at com.opensymphony.xwork2.util.finder.ClassFinder.<init>(ClassFinder.java:165) ~[xwork-core-2.2.3.jar:2.2.3]
	at org.apache.struts2.convention.PackageBasedActionConfigBuilder.findActions(PackageBasedActionConfigBuilder.java:376) [struts2-convention-plugin-2.2.3.jar:2.2.3]
	at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:334) [struts2-convention-plugin-2.2.3.jar:2.2.3]
	at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) [struts2-convention-plugin-2.2.3.jar:2.2.3]
	at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:215) [xwork-core-2.2.3.jar:2.2.3]
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) [xwork-core-2.2.3.jar:2.2.3]


げ、何だコリャ。クラスfoo.Barは間違いなくにWEB-INF/classesに配置されているのに。
しかも、com/opensymphony/xwork2/util/finder/ClassFinder$InfoBuildingVisitorはちゃんとxwork-2.2.3.jarに含まれてるぞ?


うむ。ワケワカラン。

デバッガの出番

スタックトレースが大量に出てしまって、最初のエラーが何だったのか消えてしまったので、
デバッガで起動してみた。すると、原因が判明。

詳しい説明は端折るが、要するに
com.objectweb.asm.commons.EmptyVisitor
が見つからないことが根本原因。


で、xwork-2.2.3.jarの中身を確認したところ、確かにASM関連のクラスがゴソッと消えている。
以前は、"org.objectweb.asm.xwork"などというパッケージ名で、
特定のバージョンのASMのクラスを丸ごと含んでしまっているという
行儀の悪い依存関係が設定されていたわけだが、それを除去した模様。

たしかに正しい処置なんだけど、いきなりのことなので混乱する人も多いんじゃないかなぁ。。。

で、最終的には

<dependency org="asm" name="asm-all" rev="latest.release" />

という依存関係を追加することで、解決した。ヤレヤレ。