- ベストアンサー
JAVA NoClassDefFoundError
- ジャバのNoClassDefFoundErrorエラーについて
- サンプルスクリプトをサーブレット化する際のエラーについて質問
- パッケージ名を付けるとエラーが発生する問題について
- みんなの回答 (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に入った形でデプロイされているか確認してみてください。
その他の回答 (2)
- pringlez
- ベストアンサー率36% (598/1630)
>下記がソースになりますが、パッケージ名を付ける前は正常に動作していました。 おそらくそもそもこの事実が存在しないはずです。 パッケージ名云々の話は、「Tool」というパッケージにしたにもかかわらず「java Sendmail」としていたから「Sendmail」が「NoClassDefFound」になったという話ではないのですか? それは「java Tool.Sendmail」とすることによって解決しているはずですよね。解決している別の話はわざわざ持ち出さない方がいいでしょう。 で、次にサーブレットとして呼び出そうとしたときに「Session」「MessagingException」が「NoClassDefFound」といわれる問題です。 ※同じ「NoClassDefFound」だからといって原因が同じだと思わない方がいいですよ。 一応確認ですが、パッケージ名をつけない状態でサーブレットとして動かした事実は存在しますか?おそらく存在しませんよね。なのでパッケージ名をつけたからどうのこうのではなく、サーブレットとして動かそうと思ったらできなかったという話ではないかと思います。 その原因はNo.1さんのご指摘どおり、単にClasspathの設定がきちんとできていないからなのだと思いますよ。 >javamail1_4_7と、jaf-1_1_1をサーバに配置し、 >環境変数のClasspathにて各々指定しています。 あなたはこう書いているので、それで正しく設定できているつもりなのだと思います。しかし実際にはどこかでミスをしているのでしょう。「自分は正しいはず」という前提ではなく「どこかが間違っているはず」という視点で見直しましょう。
お礼
ご回答ありがとうございます。 結局WEBINF/libに必要なライブラリを格納したらうまくいきました。 Classpathの設定は質問する前に何度も見直しており、ご指摘の後も見直しましたが間違いは内容でした。 サーバーサイドでの実行の場合Classpathは見ないという結論なのでしょうか? どちらにしてもありがとうございました!
- neuron-x
- ベストアンサー率52% (139/266)
スタックトレースなどがあれば分かりやすいのですが、SessionでNoClassDefFoundが発生している前提で話を進めます。 Sessionは、javax.mail.Sessionだと思うのですが、そうであればプログラムのpackageを指定したとしてもエラーは起きないはずです。 どのように実行したのか分かりませんが、mainメソッドがコメントアウトされていることから、サーブレット経由など、アプリケーションサーバ上で実行したと言うことで良いでしょうか。 そうであれば、作成したearやwarファイルに必要なjarファイル(javax.mail.Sessionが含まれるjarファイル)が含まれておらず、いざ実行したときにSessionクラスが見つからずにエラーになっているように見えます。 作成するwarなどに、対象のjarファイルを含めると解決できると思いますよ。
お礼
さっそくのご回答ありがとうございます。 補足させていただきましたので確認してもらえると幸いです。
補足
ご回答ありがとうございます。 昨日確認したときは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) 長々とすいません。思いつく限りの現状の内容を書かせていただきました。 お手数ですがアドバイスいただけると非常にたすかります。 よろしくお願いいたします。
お礼
WEB-INF/libに該当のjarファイルを格納したら正常動作を確認できました。 もともとWEB-INF/libにライブラリを入れることはネットで見て試していましたが、javamail1_4_7と、jaf-1_1_1の解凍したままのディレクトリごと格納していたため、ダメだったようです。回答したディレクトリ内のjarファイルだけにしたらうまくいきました。 コンソール側での動作環境と、サーバーサイドでの動作環境が異なるということと、Classpathの設定では動作しないということが今回わかりました。 大変たすかりました。ありがとうございました!!