Mac OS X LeopardでApache Axis2を使った時にjava.util.regex.PatternSyntaxException: Dangling meta character * near index 0の例外が発生する原因と解決策

今回はMac OS X特有の話.

問題が発生した環境

OSはMac OS X Leopard 10.5.7,Axis2のバージョンは1.3.Javaのバージョンは以下の通り.

$ java -showversion >/dev/null
java version "1.5.0_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02-304)
Java HotSpot(TM) Client VM (build 1.5.0_19-137, mixed mode, sharing)

症状

最近JavaのApache Axis2というライブラリを使うJavaプログラムを動かそうとしたことがあったんだけど,上述の環境で実行した時に以下の例外が発生して困った.

java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*.local
^
        at java.util.regex.Pattern.error(Pattern.java:1650)
        at java.util.regex.Pattern.sequence(Pattern.java:1787)
        at java.util.regex.Pattern.expr(Pattern.java:1687)
        at java.util.regex.Pattern.compile(Pattern.java:1397)
        at java.util.regex.Pattern.<init>(Pattern.java:1124)
        at java.util.regex.Pattern.compile(Pattern.java:817)
        at java.util.regex.Pattern.matches(Pattern.java:919)
        at java.lang.String.matches(String.java:1921)
        at org.apache.axis2.transport.http.ProxyConfiguration.validateNonProxyHosts(ProxyConfiguration.java:261)
        at org.apache.axis2.transport.http.ProxyConfiguration.isProxyEnabled(ProxyConfiguration.java:223)
        at org.apache.axis2.transport.http.AbstractHTTPSender.getHostConfiguration(AbstractHTTPSender.java:271)
        at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:502)
        at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:191)
        at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:77)
        at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:327)
        at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:206)
        at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:396)
        at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:374)
        at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:211)
        at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
        at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:528)
        at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:508)
        at org.apache.axis2.rpc.client.RPCServiceClient.invokeBlocking(RPCServiceClient.java:101)

(省略)

エラーの直接的な原因は*.localという正規表現の*を\でエスケープしていないことみたい.しかし自分のプログラムでは*.localという正規表現は使ってないし,もしAxis2の内部にこの記述があったとするとライブラリを書き換えなければならない.でも,このような正規表現のバグがあるままライブラリがリリースされているというのは考えにくいし….

また,同じMac OS X & 同じJavaでもこのエラーが発生する環境と発生しない環境があってさらに困った.Javaのバージョンはbuild番号まで含めて同じなのに….

ちなみに同じプログラムをいくつか別のOS上で実行させたところ,このようなエラーは発生しなかった.

原因

エラーについての情報が全然なかったので英語サイトも含めて必至でぐぐりまくっていたところ,以下のメーリングリストの投稿記事を発見した(ここに至るまでが長かった…).

[#AXIS2-3146] Axis client fails if http.nonProxyHosts contains * as wildcard - ASF JIRA

I've just upgraded to OS X 10.5 Leopard and get the same error with Axis2 1.3. The bug is exposed by Leopard as under:

System Preferences -> Network -> AirPort -> Proxies:Bypass proxy settings...

it has the list:

*.local, 169.254/16

removing *.local from the list solved the problem.

「プロキシを利用しないホストとドメイン」の設定が悪さをしているらしい…?ということで自分のネットワーク設定を確認してみた.

確かに「プロキシを利用しないホストとドメイン」の箇所に問題の*.localが書かれていた.どうやらプロキシが有効になっているかどうかに関わらずAxis2はここの設定を利用する & Axis2が*のエスケープをちゃんとやってくれないことが真の原因らしい.これはいいMac OS X特有のバグ….

ちなみに例外が発生しなかったMac OS Xのプロキシ設定を確認したところ,この設定は空欄になっていた.だからこちらでは問題なく実行できたのか….

解決

というわけで,「プロキシを利用しないホストとドメイン」の*.localを削除して解決.

こういう訳の分からないエラーで困った時は,一歩下がって問題の周辺を含めて俯瞰することが重要だということを痛感した.