axis2でのサービスの設定ファイル

axis2でサービスをdeployする時は関連ファイルをすべてまとめたzipファイルをaarという拡張子にしてコンテナのWEB-INF/servicesディレクトリに置く。
まあ至極簡単でいいのだが、サービス独自の設定ファイルをどこに置くかが問題になる。
aarファイルに入れるのが一番簡単だが、それでは設定を変える度にアーカイブを作り直さなければならず、結構面倒だ。
aarファイルに入れないのであればどこかクラスパスとして認識されるディレクトリに置くしかないが、axis2のクラスパス階層ではaarファイルの中身以外はすべてのサービスで共通となり、サービスごとに異なるディレクトリを指定することができない。
WEB-INF/classesあたりにすべてのサービスの設定ファイルを置いてもいいが、あまりスマートでもない。

そこで、サービスごとに固有のクラスパスを設定できるようにaxis2のソースを改造してみた。
対象のクラスはorg.apache.axis2.deployment.util.Utils
対象のメソッドはcreateClassLoader(URL[], ClassLoader, boolean, File, boolean)

URL[] urls1 = Utils.getURLsForAllJars(urls[0], tmpDir);
// 追加 ↓
String archiveName = new File(urls[0].getFile()).getName();
if (archiveName.endsWith(".aar")) {
  archiveName = archiveName.substring(0, archiveName.length() - 4);
  // WEB-INF/conf/(アーカイブ名)というディレクトリがあればクラスパスに追加する
  // WEB-INFに限定しているわけではないので、既存のクラスパスにconfというディレクトリがあればそこが対象になったりもする。
  URL conf = serviceClassLoader.getResource("conf/" + archiveName);
  if (conf != null) {
    List<URL> urlList = new ArrayList<URL>(Arrays.asList(urls1));
    urlList.add(0, conf);
    urls1 = urlList.toArray(new URL[urlList.size()]);
  }
}
// 追加 ↑
return createDeploymentClassLoader(urls1, serviceClassLoader, null, isChildFirstClassLoading);

改造したクラスをコンテナのWEB-INF/classesに入れると、コメントにある通りconfディレクトリ内のアーカイブごとのサブディレクトリがクラスパスとして認識されるようになる。

もう一つcreateClassLoader(ArrayList, ClassLoader, boolean, File, boolean)というメソッドにも似たようなコードがあるが、こちらはいつ呼ばれるのかよくわからない。
POJOを使う時か?
もし必要なら同様に改造してください。


2012/02/21追記
Utilsクラスの改造しなくてもできるみたい。
http://d.hatena.ne.jp/TAKESHI/20120221