JAVA NoClassDefFoundError

このQ&Aのポイント
  • ジャバのNoClassDefFoundErrorエラーについて
  • サンプルスクリプトをサーブレット化する際のエラーについて質問
  • パッケージ名を付けるとエラーが発生する問題について
回答を見る
  • ベストアンサー

JAVA NoClassDefFoundError

javadriveHPのサンプルスクリプトにてメール配信プログラムを動かそうとしています。 環境構築は完了し、サンプルスクリプトも動作確認できました。 そこで、そのスクリプトをサーブレット化しようとして、パッケージ名を付けたところからNoClassDefFoundError(どうやらSessionのようです)が発生しています。 いろいろサイトも調べて解説も読みましたが、どこを直せばよいか検討がつかなかったので質問させていただきました。 下記がソースになりますが、パッケージ名を付ける前は正常に動作していました。 頭悪い私を助けてください;; よろしくお願いします! package Tool; import java.util.*; import java.io.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class Sendmail { public String mailHost = ""; public String mailTo = ""; public String mailFrom = ""; public String mailSubject = ""; public String mailMessage = ""; public Sendmail(){} public void setHost (String h) { mailHost = h; } public void setTo (String t) { mailTo = t; } public void setFrom (String f) { mailFrom = f; } public void setSubject (String s) { mailSubject = s; } public void setMessage (String m) { mailMessage = m; } public void mailSend() { Properties props = new Properties(); props.put("mail.smtp.host", mailHost); props.put("mail.host", mailHost); props.put("mail.from", mailFrom); Session s = Session.getInstance(props); try { MimeMessage msg = new MimeMessage(s); msg.setFrom(new InternetAddress(mailFrom)); InternetAddress[] address = InternetAddress.parse(mailTo); msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject(mailSubject, "ISO-2022-JP"); msg.setSentDate(new Date()); msg.setText(mailMessage, "ISO-2022-JP"); Transport.send(msg); } catch(MessagingException mex) { System.out.println("--Exception handling in msgsendsample.java"); mex.printStackTrace(); } } /* public static void main(String args[]) { Sendmail sm = new Sendmail(); sm.setHost("XX.XX.XX.XX"); sm.setTo("XXXX@XXXX"); sm.setFrom("XXX@XXX"); sm.setSubject("ああああ"); sm.setMessage("いいいいい"); sm.mailSend(); } */ }

  • Java
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.3

#1です。 > package宣言後はNoClassDefFoundErrorが発生しますが、実行時にjava Tool.Sendmailと書くと実行されるのを確認しました。 コンソールから実行したときに発生していたNoClassDefFoundErrorと、サーバサイドで実行したときに出ているエラーは少し原因が違いますね。最初に出ていたエラーは、java実行時にmainメソッドが含まれているクラスを指定する必要があるのですが、package指定でFQNがSendmailからTool.Sendmailに変わったため、java Sendmailだと、そんなクラス(デフォルトパッケージのSendmailクラス)は存在しない…という事でエラーになっていた物です。 一方、サーバサイドで実行したときに出ているエラーは、javamail系の必要なライブラリが見つからずに発生してるエラーになると思います。(同じNoClassDefFoundErrorでも、見つからないクラスに違いがあります) > javamail1_4_7と、jaf-1_1_1をサーバに配置し、環境変数のClasspathにて各々指定しています。 サーバサイドの場合、環境変数のclasspathは見られていないかもしれません。どちらかというと、Webアプリケーションの設定自体で参照するライブラリを指定するような形になります。(もしくは、アプリケーションサーバ全体で利用できるlibフォルダに必要なjarファイルを格納してしまう…という手もあります。ただ、他のアプリケーションに影響する場合もあるので、各warファイル等に個別にライブラリを格納する方法をおすすめします) 各Webアプリケーションの場合は、展開された/WEB-INF/lib/配下に必要なライブラリが含まれることになると思います。(このディレクトリ構成はアプリケーションサーバ全体で決まりがあるため、TomcatのようなAPサーバ(厳密にはAPサーバとは呼べないけど)やWebLogic、WebSphereなどでも同じになります) この構成については色々情報が公開されていますので、興味があれば調べてみると良いと思います。 例: http://thinkit.co.jp/free/article/0708/2/6/ 今回の場合ですと、必要なライブラリ系がWEB-INF/libに入った形でデプロイされているか確認してみてください。

chibitaChan
質問者

お礼

WEB-INF/libに該当のjarファイルを格納したら正常動作を確認できました。 もともとWEB-INF/libにライブラリを入れることはネットで見て試していましたが、javamail1_4_7と、jaf-1_1_1の解凍したままのディレクトリごと格納していたため、ダメだったようです。回答したディレクトリ内のjarファイルだけにしたらうまくいきました。 コンソール側での動作環境と、サーバーサイドでの動作環境が異なるということと、Classpathの設定では動作しないということが今回わかりました。 大変たすかりました。ありがとうございました!!

その他の回答 (2)

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.2

>下記がソースになりますが、パッケージ名を付ける前は正常に動作していました。 おそらくそもそもこの事実が存在しないはずです。 パッケージ名云々の話は、「Tool」というパッケージにしたにもかかわらず「java Sendmail」としていたから「Sendmail」が「NoClassDefFound」になったという話ではないのですか? それは「java Tool.Sendmail」とすることによって解決しているはずですよね。解決している別の話はわざわざ持ち出さない方がいいでしょう。 で、次にサーブレットとして呼び出そうとしたときに「Session」「MessagingException」が「NoClassDefFound」といわれる問題です。 ※同じ「NoClassDefFound」だからといって原因が同じだと思わない方がいいですよ。 一応確認ですが、パッケージ名をつけない状態でサーブレットとして動かした事実は存在しますか?おそらく存在しませんよね。なのでパッケージ名をつけたからどうのこうのではなく、サーブレットとして動かそうと思ったらできなかったという話ではないかと思います。 その原因はNo.1さんのご指摘どおり、単にClasspathの設定がきちんとできていないからなのだと思いますよ。 >javamail1_4_7と、jaf-1_1_1をサーバに配置し、 >環境変数のClasspathにて各々指定しています。 あなたはこう書いているので、それで正しく設定できているつもりなのだと思います。しかし実際にはどこかでミスをしているのでしょう。「自分は正しいはず」という前提ではなく「どこかが間違っているはず」という視点で見直しましょう。

chibitaChan
質問者

お礼

ご回答ありがとうございます。 結局WEBINF/libに必要なライブラリを格納したらうまくいきました。 Classpathの設定は質問する前に何度も見直しており、ご指摘の後も見直しましたが間違いは内容でした。 サーバーサイドでの実行の場合Classpathは見ないという結論なのでしょうか? どちらにしてもありがとうございました!

  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.1

スタックトレースなどがあれば分かりやすいのですが、SessionでNoClassDefFoundが発生している前提で話を進めます。 Sessionは、javax.mail.Sessionだと思うのですが、そうであればプログラムのpackageを指定したとしてもエラーは起きないはずです。 どのように実行したのか分かりませんが、mainメソッドがコメントアウトされていることから、サーブレット経由など、アプリケーションサーバ上で実行したと言うことで良いでしょうか。 そうであれば、作成したearやwarファイルに必要なjarファイル(javax.mail.Sessionが含まれるjarファイル)が含まれておらず、いざ実行したときにSessionクラスが見つからずにエラーになっているように見えます。 作成するwarなどに、対象のjarファイルを含めると解決できると思いますよ。

chibitaChan
質問者

お礼

さっそくのご回答ありがとうございます。 補足させていただきましたので確認してもらえると幸いです。

chibitaChan
質問者

補足

ご回答ありがとうございます。 昨日確認したときはSessionでNoClassDefFoundErrorでしたが、 今回確認したところMessagingExceptionで同様にエラーになっておりました。 すいません。。。。 また説明が下手、不足していてごめんなさい。下記に追記させていただきます。 ご指摘いただいた「javax.mail.Sessionが含まれるjarファイルが含まれていない」 につきましては、javadriveの手順(www.javadrive.jp/javamail/)にありますが、 javamail1_4_7と、jaf-1_1_1をサーバに配置し、環境変数のClasspathにて各々指定しています。 javamail1_4_7内のmail.jar内に、Sessionも今回のMessagingExceptionも.classが存在するのを確認しています。 また、mainメソッドがコメントアウトされている理由はご認識のとおりです。 エラーまでの経緯の概要を下記に記述します。 まずpackage宣言無しで動かしてみて正常動作を確認しました。 (package宣言後はNoClassDefFoundErrorが発生しますが、  実行時にjava Tool.Sendmailと書くと実行されるのを確認しました。) これをJSPからサーブレットとして動作させたいので、 package宣言を追記、mainメソッドをコメントアウトして次のようにJSPから呼び出します。 ---------------------- <%@page import="Tool.*"> ...省略 Sendmail sm = new Sendmail(); sm.setHost("X.X.X.X"); sm.setTo("XXX@XXXX"); sm.setFrom("XXX@XXXX"); sm.setSubject("XXX"); sm.setMessage("XXX"); sm.mailSend(); ←ここでNoClassDefFoundError: javax/mail/MessagingException ---------------------- すると上のところでエラーになります。 そのときのスタックトレースの一部を掲載させていただきます。 原因 java.lang.NoClassDefFoundError: javax/mail/MessagingException org.apache.jsp.XX_jsp._jspService(org.apache.jsp.XX_jsp:186) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:123) 長々とすいません。思いつく限りの現状の内容を書かせていただきました。 お手数ですがアドバイスいただけると非常にたすかります。 よろしくお願いいたします。

関連するQ&A

  • 添付ファイルの送信プログラムについて

    JSPとServletで作成された添付ファイル付きメールの送信プログラムがあります。以下にその一部を掲載します。 ***** SendForm.jsp ****** <form action="test/servlet/SendMail"> <input type="submit" value="添付する"> </form> ************************* ***** SendMail.java ***** public void doGet( 略 ) throws 略 { try { Properties props = System.getProperties(); props.put("mail.smtp.host", "xxx.xxx.xxx.xxx"); Session session = Session.getDefaultInstance(props, null); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("test@test.co.jp", "テスト","iso-2022-jp")); msg.setRecipients(Message.RecipientType.TO, "test@test.co.jp"); msg.setSubject("テストメール!" , "iso-2022-jp"); MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText("これはテストメールです。" , "iso-2022-jp"); MimeBodyPart mbp2 = new MimeBodyPart(); FileDataSource fds = new FileDataSource("テスト.xls"); mbp2.setDataHandler(new DataHandler(fds)); mbp2.setFileName(MimeUtility.encodeWord(fds.getName())); Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp1); mp.addBodyPart(mbp2); msg.setContent(mp); msg.setSentDate(new Date()); Transport.send(msg); } catch(Exception e) { ( 略 ) } } ************************* 字数が制限されていますので、関係ないところは( 略 )とさせていただいています。 SendForm.jspで「添付する」を押して添付ファイルの送信処理を開始すると、HTTPの501番エラーが発生して、ファイルを送信することができなくなってしまいます(例外は一切発生していません)。なぜ例外ではなく501番のエラーが発生するのでしょうか。

    • ベストアンサー
    • Java
  • StringデータをZIP圧縮してメール添付したい

    以下のロジックで、CSVファイルを送っています。 ファイルサイズが大きくなったので、StringのデータをZIP圧縮して添付したいです。 どのように、ロジックを書けば良いかお教えください。 お願いします。 「java初心者です。」 @SuppressWarnings("serial") public class BackTest_MailServlet extends HttpServlet { @SuppressWarnings("unchecked") public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { MailSendTo(meigara1,intYMDFrom ,strSimulationkekka,intJobID); } public void MailSendTo(String meigara1,int intYMDFrom ,String strSimulationkekka,int intJobID) throws IOException{ Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); try{ MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("abcxyz000aa@gmail.com")); msg.addRecipient(Message.RecipientType.TO, new InternetAddress("abcxyz000aa@gmail.com")); int intAttacheSize = strSimulationkekka.length(); String strAttacheFile = strSimulationkekka; String strFileName = meigara1 + "_" + intYMDFrom +"_" + intJobID; msg.setSubject("AA:"+meigara1 +" Size:" + intAttacheSize +" JobID:" + intJobID + " YMD:" + intYMDFrom,"ISO-2022-JP"); // // 本文ボディー部分. // MimeBodyPart body = new MimeBodyPart(); body.setText("メール本文","text/plain"); // メール本文 Multipart mp = new MimeMultipart(); mp.addBodyPart(body); MimeBodyPart attache = new MimeBodyPart(); // //StringのstrAttacheFileをZIPで圧縮して送りたい // attache.setText(strAttacheFile);//添付ファイルの中身 attache.setFileName(strFileName + ".csv"); // 添付ファイル名 mp.addBodyPart(attache);// 添付 msg.setContent(mp); Transport.send(msg); // resp.getWriter().write("OK!!: メール送信完了<br />"); }catch(AddressException e){ // resp.getWriter().write("メールアドレスエラー" + e + "<br />"); }catch(MessagingException e){ // resp.getWriter().write("メッセージングエラー" + e + "<br />"); } } }

    • ベストアンサー
    • Java
  • ”main”NoClassDefFoundErrorについて

    /*---------------------------------------- KeyEvent のサンプル ----------------------------------------*/ import javax.swing.*; import java.awt.event.*; import java.awt.*; public class KeyEventSample{ JFrame frame = new JFrame("KeyEventは誰が取る?"); Canvas canvas = new Canvas(); public KeyEventSample(){ canvas.setSize(200,200); frame.getContentPane().add(canvas,"Center"); frame.pack(); frame.setVisible(true); KeyListener listener1 = new KeyDealer("frame"); frame.addKeyListener(listener1); KeyListener listener2 = new KeyDealer("canvas"); canvas.addKeyListener(listener2); } public static void main(String[] args){ new KeyEventSample(); } } class KeyDealer extends KeyAdapter{ String name; public KeyDealer(String name){ this.name = name; } public void keyPressed(KeyEvent ke){ System.out.println(name + " got " + ke.getKeyCode()); } } 上記のようなソースファイルをコンパイルし、javaコマンドで起動しようとすると 下記のようなエラーが出ます。いろいろサンプルプログラムを試してみたのですが、すべて同じメッセージです。何か根本的なところでミスがあると思うのですがわかりません。誰か教えていただけないでしょうか。ちなみにSDK1.3を使用しています。 Exception in thread "main" java.lang.NoClassDefFoundError:KeyEventSample/class

    • ベストアンサー
    • Java
  • Javaのガーベジコレクションについて

    class Sample{ Sample sm; } class SampleMain{ public static void main(String[] args){ Sample sm1 = new Sample(); Sample sm2 = new Sample(); sm1.sm = sm2; sm2.sm = sm1; sm1 = null; sm2 = null; } } このプログラムでガーベジコレクションの対象(実行される可能性がある)は何行目になりますか?

    • ベストアンサー
    • Java
  • basp21を利用した送信

    basp21を利用した送信 エクセル2002使用です。 VBAを利用してbasp21.dll(Proではない)を使ってメール送信ををしたいのですが、 フリーソフト版のbasp21.dllで、(POP before SMTP)は利用できるのでしょうか? sub test() dim bobj as Object dim kekka as string, strkk as string, strjikan as string dim mailServer as string, mailFrom as string, mailTo as string, MailSubject as string, mailBody as string, mailFiles as string Set bobj = CreateObject("basp21") mailServer = "mail.***.com"    ’←(POP before SMTP)にしたいのです。 mailFrom = "***@***.com" mailTo = "***@***.com" MailSubject = "タイトル" mailBody = "本文" mailFiles = "d:\autocsv\wddc\" & strkk & strjikan & ".doc" kekka = bobj.SendMail(mailServer, mailTo, mailFrom, MailSubject, mailBody, mailFiles) end sub よろしくお願いします。

  • JavaMailでメールアドレスに人物名が入るようにしたい

     urizakaです。  さて、現在JSPでメールを指定した相手に送るというアプリケーションを作って いるのですが、メールが送られた相手のメールソフト(主にOutLookが対象です) の差出人の欄に、メールアドレスだけではなく差出人の名前が出るようにしたい のですが、どなたか方法をご存知の方いらっしゃいますか?  現在は、  String msg_from = request.getParameter("mail"); // JSPからメールアドレスを取得。  msg.setFrom(new InternetAddress(msg_from)); //メールアドレスをセット  となっており、相手の差出人欄には差出人のメールアドレスのみが表示されて いる状態です。   どうぞ、宜しくお願いします。

    • ベストアンサー
    • Java
  • 添付ファイルが送れない

    いつもお世話になっています。 Eclipse(Juno) を使って、Android のメールアプリを作っています。 PCの OS は Windows7 64bit です。 いろいろ、教えていただいて、メールの受信、添付されているファイルの取り出しはできました。 今回は、添付ファイル付のメールの送信です。 ネットにあったソースコードを使って、画像データ "mdata05.bin" を添付ファイルにして メール送信を試しています。 DDMS でみると、files のところに、"mdata05.bin" は存在します。 次のコードで送信すると、 private void sendmail() { try{ String to = "宛先"; String from = " Gメールアドレス"; String filename = "mdata05.bmp"; Properties property = new Properties(); //GmailのSMTPを使う場合 property.put("mail.smtp.auth", "true"); property.put("mail.smtp.starttls.enable", "true"); property.put("mail.smtp.host", "smtp.gmail.com"); property.put("mail.smtp.port", "587"); Session session = Session.getInstance(property, new javax.mail.Authenticator(){ protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication("Gメールアドレス", "パスワード"); } }); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); InternetAddress[] address = InternetAddress.parse(to); msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject("JavaMail APIs Test", "ISO-2022-JP"); msg.setSentDate(new Date()); /* 添付ファイルの処理 */ MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText("msgTextテスト", "ISO-2022-JP"); MimeBodyPart mbp2 = new MimeBodyPart(); FileDataSource fds = new FileDataSource("mdata05.bmp");//filename); mbp2.setDataHandler(new DataHandler(fds)); mbp2.setFileName(MimeUtility.encodeWord(fds.getName())); Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp1); mp.addBodyPart(mbp2); msg.setContent(mp); Transport.send(msg); }catch(MessagingException mex){ System.out.println("¥n--Exception handling in msgsendsample.java"); mex.printStackTrace(); }catch(java.io.UnsupportedEncodingException uex){ } MessagingException mex のエラーの内容としては、 IOException while sending message" とあって、詳しく見ると "/mdata05.bmp: open failed: ENOENT (No such file or directory)" となっています。 添付ファイルが送れない原因は何でしょうか? なお、添付ファイルの部分を削除すれば、本文だけのメールは送信できます。 ご指導、よろしくお願いします。

  • javaの課題プログラムでどうしてもわかりません。

    以下(senderTest)のプログラムを適切に繰り返すように書き換えたいのですが、どうしてもうまくいきません。while文で自分なりに繰り返した結果は同じ文字を送り続けるというものになってしまいました。 本来は送信して、待機状態になりまた新たに文字を入力したら送信、また待機というようにしたいのですがどうしたらよいでしょうか? どうかよろしくおねがいします。 ******************************** senderTest import java.io.*; import java.net.*; public class senderTest { private InetAddress address; private int port = 13400; private DatagramSocket socket; public senderTest() throws Exception { this.address = InetAddress.getByName("192.168.0.16"); this.socket = new DatagramSocket(); } public void send(String s) throws Exception { byte buffer[]; buffer = s.getBytes("Shift_JIS"); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, this.address, this.port); this.socket.send(packet); } public static void main(String[] args)throws IOException { senderTest sender1; System.out.println("↓送信する文字を入力してください↓"); String name = ("健児>"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String msg = name +br.readLine(); try { sender1 = new senderTest(); sender1.send(msg); System.out.println("『" + msg + "』を送信しました。"); } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); } } } ********************************

    • ベストアンサー
    • Java
  • javaのudp通信について

    javaのudp通信を使用して簡単なチャットプログラムを作っています。サーバーなどは使用しないものです。 送信、受信それぞれのプログラムはできました。送信は送信を繰り返し、受信も受信を繰り返すものです。それをひとつにしたいと考えています。 送信プログラムの詳細はhttp://oshiete1.goo.ne.jp/qa3743572.htmlです。 受信プログラムは下記です。 ご指導お願いします。 ******************************** import java.net.*; public class reciverTest { DatagramPacket packet1; private DatagramSocket socket1; private int port = 19800; public reciverTest() throws Exception { this.socket1 = new DatagramSocket(this.port); } public String receive() throws Exception { byte buffer[] = new byte[256]; int i; packet1 = new DatagramPacket(buffer, buffer.length); this.socket1.receive(packet1); // blocking for (i = 0; i < buffer.length; i++) { if (buffer[i] == '\0') { break; } } String msg = new String(packet1.getData(), 0, i); return msg; } public void close() throws Exception { socket1.close(); } public static void main(String[] args) { reciverTest receiver1; System.out.println("Waiting ..."); try { receiver1 = new reciverTest(); while(true) { String msg = receiver1.receive(); System.out.println("受信したデータ⇒『" + msg +"』を受信しました。"); receiver1.close(); } } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); } } }

    • ベストアンサー
    • Java
  • Javaでタイマーの使い方

    Javaでタイマーの使い方作り方がわかりません import javax.swing.Timerこれつかいます。 package Test1; import javax.swing.Timer; public class Test1 { Timer TM = new Timer(10, null); public static void main(String[] args) { } } よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう