web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:javax / mail / Authenticator、どうしたの?

Email.Javaに送信

package helper;

//Mail.Java - smtp sending starttls (ssl) authentication enabled
//1.Open a new Java class in netbeans (default package of the project) and name it as "Mail.Java"
//2.Copy paste the entire code below and save it.
//3.Right click on the file name in the left side panel and click "compile" then click "Run"

import javax.mail.*;
import javax.mail.internet.*;
import Java.util.*;

public class sendToEmail
{
    String  d_email = "[email protected]",
     d_password = "mysamplepassword",
     d_Host = "smtp.gmail.com",
     d_port  = "465",
     //m_to = "[email protected]",
     m_subject = "trial",
     m_text = "Hey, this is the testing email.";

    public sendToEmail(String strEmailAddress)
    {


        Properties props = new Properties();
        props.put("mail.smtp.user", d_email);
        props.put("mail.smtp.Host", d_Host);
        props.put("mail.smtp.port", d_port);
        props.put("mail.smtp.starttls.enable","true");
        props.put("mail.smtp.auth", "true");
        //props.put("mail.smtp.debug", "true");
        props.put("mail.smtp.socketFactory.port", d_port);
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");

        SecurityManager security = System.getSecurityManager();

        try
        {
            Authenticator auth = new SMTPAuthenticator();
            Session session = Session.getInstance(props, auth);
            //session.setDebug(true);

            MimeMessage msg = new MimeMessage(session);
            msg.setText(m_text);
            msg.setSubject(m_subject);
            msg.setFrom(new InternetAddress(d_email));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(strEmailAddress));
            Transport.send(msg);
        }
        catch (Exception mex)
        {
            mex.printStackTrace();
        } 
    }

    public class SMTPAuthenticator extends javax.mail.Authenticator
    {
        public PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(d_email, d_password);
        }
    }
}

controller.Javaの一部

/* Send to Email will run properly soon */
            sendToEmail email = new sendToEmail(strEmailAddress);

Webアプリケーションを実行すると、次のエラーメッセージが表示されました。

タイプ例外レポート

メッセージ

説明サーバーは、この要求の実行を妨げる内部エラー()を検出しました。

exception javax.servlet.ServletException:サーブレットの実行が例外をスローしました

根本原因Java.lang.NoClassDefFoundError:javax/mail/Authenticator controller.RegisterTenantController.doPost(RegisterTenantController.Java:108)javax.servlet.http.HttpServlet.service(HttpServlet.Java:709)javax.servlet.http.HttpServlet.service (HttpServlet.Java:802)

私は今何をしますか?このWebアプリケーションを成功させるために誰か助けてもらえますか?

31
bluestella

WEB-INF/libディレクトリまたはwebapp(またはサーバーのlibディレクトリ)に2つのjarを追加する必要があります。

47

これは、jarファイルがクラスパスにないためである可能性がありますが、そうでない場合があります。

この場合、頭の中に2つまたは3つの異なる例外海峡を保つことが重要です。

  1. _Java.lang.ClassNotFoundException_この例外は、クラスパスでクラスが見つからなかったことを示します。これは、クラス定義をロードしようとしており、クラスがクラスパスに存在しなかったことを示しています。

  2. _Java.lang.NoClassDefFoundError_この例外は、JVMが内部クラス定義データ構造でクラスの定義を検索し、それを見つけられなかったことを示します。これは、クラスパスからロードできなかったということとは異なります。通常、これは以前にクラスパスからクラスをロードしようとしましたが、何らかの理由で失敗したことを示しています-今、もう一度試みていますが、ロードに失敗したため、ロードしようとさえしません。以前の障害は、ClassNotFoundExceptionまたはExceptionInInitializerError(静的初期化ブロックの障害を示す)または他の多くの問題である可能性があります。ポイントは、NoClassDefFoundErrorは必ずしもクラスパスの問題ではないということです。

_javax.mail.Authenticator_のソースを見て、それが静的初期化子で何をしているのかを確認します。 (もしあれば、静的変数の初期化と静的ブロックを見てください。)ClassNotFoundExceptionの前にNoClassDefFoundErrorを取得していなければ、それが静的初期化であることはほぼ保証されます。問題。

Hostsファイルでlocalhostアドレスが誤って定義され、静的初期化ブロックがInetAddress.getLocalHost()に依存している場合、同様のエラーが頻繁に発生します。 127.0.0.1は「localhost」(およびおそらくlocalhost.localdomainも)を指している必要があります。マシンの実際のホスト名を指すべきではありません(何らかの理由で、多くの古いRedHat Linuxインストーラーが間違った設定を好んでいました)。

26
Jared

Maven依存関係に以下を追加します

    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.5</version>
    </dependency>

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
20
Koray Güclü

この状況で一度実行すると、クラスパスに依存関係がありました。解決策は、javax.mailおよびjavax.activationライブラリをコンテナ(たとえばTomcat)のlibフォルダーに含めることでした。 Mavenを使用して、それらをprovidedスコープに設定すると、動作するはずです。すべてのプロジェクトのクラスパスでメールライブラリを共有します。

有用なソース: http://haveacafe.wordpress.com/2008/09/26/113/

8
zeratul021

この問題が発生したとき、mail-api.jar私のmaven pomファイル。それがAPI仕様ですonly。修正はこれを置き換えることです:

<!-- DO NOT USE - it's just the API, not an implementation -->
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>

そのAPIの参照実装を使用します。

<groupId>com.Sun.mail</groupId>
<artifactId>javax.mail</artifactId>

パッケージ名にSunが含まれていることは知っていますが、それは最新バージョンです。私はこれを https://stackoverflow.com/a/28935760/1128668 から学びました

4
GlenPeterson

私も同じようなエラーに直面していました。以下の2つのステップを試してください(最初のステップは既にここで推奨されています)-1. pom.xmlに依存関係を追加します

         <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.5</version>
        </dependency>

        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
  1. それでもうまくいかない場合は、jarファイルを.m2\repository\javax\<folder>\<version>\ディレクトリに手動で配置してください。
0
Manan Shah