Tomcat 5.5 の一部バージョンでは JavaMail の JNDI リソースが動かない

2007/07/13 8:45am

Tomcat のバージョンを 5.5.17 から 5.5.23 にあげたところ、次のような例外が発生するようになった。

javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.naming.factory.MailSessionFactory]
  at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:132)

JNDI から JavaMailjavax.mail.Session を取り出すときに失敗しているようだ。

MailSessionFactory が見つからないってことはまたクラスパス周りの問題かな、面倒くさいな…」と思いきや、検索してみると、次のようなバグ報告が。

Bug 40668 - MailSessionFactory is missing in Tomcat 5.5.23 http://issues.apache.org/bugzilla/show_bug.cgi?id=40668

Tomcat 5.5.20 から現時点での最新バージョンである 5.5.23 では Tomcat 自体のビルドプロセスに問題があって(クラスパスに JavaMail が含まれていない?)、naming-factory.jar に JavaMail 関連のクラスがなくなっているらしい。

いまだに直ってない、ってのがすごいな。

この際、SMTP でメールを送信するくらいの用途なら、JNDI やめちゃうってのも手だと思う。JNDI のルックアップって非結合になっているようで、結局、新しい依存性を持ち込んでるだけ、というか、テストを考えると余計面倒だし。

Context context = new InitialContext();
Session session = (Session) context.lookup("java:comp/env/mail/Session");

これを

Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
Session session = Session.getDefaultInstance(props);

こんな感じで。