【Java】JavaMailを使用するときの依存性解決についての説明

「JavaMail」を使用するためMavenリポジトリを確認したところ、似たような選択肢として以下に記載する4つがありました。

  1. JavaMail:https://mvnrepository.com/artifact/javamail/javamail
  2. JavaMail API (compat):https://mvnrepository.com/artifact/javax.mail/mail
  3. JavaMail API JAR:https://mvnrepository.com/artifact/javax.mail/javax.mail-api
  4. JavaMail API:https://mvnrepository.com/artifact/com.sun.mail/javax.mail

結果的に「4.」を選択することになりますが、それぞれの違いについてなどの説明を記載していきます。

スポンサーリンク

JavaMail

Mavenリポジトリ:https://mvnrepository.com/artifact/javamail/javamail

Mavenリポジトリを表示すると以下の情報が表示されていると思います。

Note: This artifact was moved to:
javax.mail » mail

https://mvnrepository.com/artifact/javamail/javamail

このライブラリは別へ移動したことを示しています。新しく依存性解決に追加する場合は、指定されているライブラリを使用するようにします。このため、このライブラリを選択することはなくなります。

JavaMail API (compat)

Mavenリポジトリ:https://mvnrepository.com/artifact/javax.mail/mail

Mavenリポジトリを表示すると以下の情報が表示されていると思います。

Note: This artifact was moved to:
javax.mail » javax.mail-api

https://mvnrepository.com/artifact/javax.mail/mail

このライブラリは別へ移動したことを示しています。新しく依存性解決に追加する場合は、指定されているライブラリを使用するようにします。このため、このライブラリを選択することはなくなります。

JavaMail API JAR

Mavenリポジトリ:https://mvnrepository.com/artifact/javax.mail/javax.mail-api

Mavenリポジトリを確認すると定期的に更新されています。2019年6月の時点では、最新バージョンが以下のようになっています。

  • バージョン:1.6.2
  • リリース日:2019年8月

このライブラリの詳細を確認するとCompile Dependencies(コンパイル時の依存性関係)もないため、このライブラリだけで動作するように思えます。

ところが、JavaMailでメッセージ作成するため「javax.mail.Session」インスタンスを作成する時に以下の例外が発生します。

java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger

この例外は、クラスが存在しない場合に発生する例外になります。依存性関係の記載はないですが、実行時は例外となる問題が発生します。

依存性関係に「com.sum.mail」を追加することで問題を解決することができます。ただし、次に説明する「JavaMail API」では、1つの依存性関係を追加するだけでJavaMailを使用できるようになります。依存性関係を減らすことを考えた場合は、このライブラリを使用する必要性へ減ると考えられます。

JavaMail API

Mavenリポジトリ:https://mvnrepository.com/artifact/com.sun.mail/javax.mail

Mavenリポジトリを確認すると定期的に更新されています。2019年6月の時点では、最新バージョンが以下のようになっています。

  • バージョン:1.6.2
  • リリース日:2019年8月

このライブラリを使用することでJavaMailを送信することができます。

また、https://javaee.github.io/javamail/#Download_JavaMail_Releaseにも、依存性関係として以下の記載があるため、このライブラリを選択するのが正しいと考えられます。

 <dependencies>
            <dependency>
                <groupId>com.sun.mail</groupId>
                <artifactId>javax.mail</artifactId>
                <version>1.6.2</version>
            </dependency>
        </dependencies>

まとめ

JavaMailを使用するときのMavenリポジトリと使用する依存性関係の説明を紹介しました。