ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

企業提供API呼出クラスとSAStrutsを併用する際には要注意

 現在、某グループウェア大手の製品をスマートデバイスから扱うアプリを開発しているんですが、これが上手く動かなくてしばらく悩んだのでメモ書き。



 SAStruts上で、この企業から提供されたAPI呼出jarを用いて呼び出そうとしたら、実行時にNoClassDefFoundErrorが発生していました。「com.xxxxxx.xxxxxx.common.Action」というクラスが無いと言われるんですね。jarにはちゃんとパスが通っている、jarの中を開いてもちゃんとクラスが確認できる、でもクラスが無いと怒られる。なんなんだいったい!?


 で、結論なんですが、無いと言われているクラスを「com.xxxxxx.xxxxxx.common.XXXAction」のように名前を変更→再コンパイル→jar化して参照するようにしたら事態を解決できました。

 要するに、SAStrutsAPI呼出jarで「Action」というクラス名が被ってて、一方しか参照できなくなっていたようです。



 今回の対処法はいくつか問題があります。

  • jarの元となるソースコードを配布されてなかったら対処できなかった。(そしておそらく製造元は対処してくれない)
  • 提供ソースコードに手を入れたことで製造元からのサポートから外れてしまう可能性がある

 
 一応は解決を見たけど今後運用まで考えると、あんまり円満解決ともいえない事例でした。あー、すっきりしない。


追記

 この後もNoSuchClassExceptionだのNoSuchMethodErrorだのが出まくっててるので、名前の衝突とかじゃなくてjarのつくりが悪いだけな気がしてきた。この企業はサポートも非常に悪いので、おそらく二度と使わないと思う。