- PR -

ServletでHibernateを使うとjava.lang.NoClassDefFoundError: org/hibernate/Sessionエラーが起きる。

投稿者投稿内容
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-04-13 10:16
OS:Windows XP
DB:PostgreSQL
Struts:1.3.8
Hibernate:3.2
Tomcat:5.5.2

ローカルでは動くプログラムがサーブレットで動かすとエラーが起こります。

エラーは以下です。
java.lang.NoClassDefFoundError: org/hibernate/Session
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
java.lang.Class.getConstructor0(Unknown Source)
java.lang.Class.newInstance0(Unknown Source)
java.lang.Class.newInstance(Unknown Source)
org.apache.struts.chain.commands.util.ClassUtils.getApplicationInstance(ClassUtils.java:71)
org.apache.struts.chain.commands.servlet.CreateAction.createAction(CreateAction.java:98)
org.apache.struts.chain.commands.servlet.CreateAction.getAction(CreateAction.java:68)
org.apache.struts.chain.commands.AbstractCreateAction.execute(AbstractCreateAction.java:90)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


ソース的にはこんな感じです。
public class LoginAction extends Action {
//@SuppressWarnings("finally")
public ActionForward execute(ActionMapping map, ActionForm frm,
HttpServletRequest req, HttpServletResponse res) {

UserForm _userForm = (UserForm) frm;
// 実行する処理の種類を格納
String action = req.getParameter("action");

// ArrayList errors = new ArrayList();
String foward = "error";
// Session session;

Session session = new Configuration().configure().buildSessionFactory().openSession();
Transaction tx = session.beginTransaction();

tx.commit();
session.close();
return map.findForward(foward);
}
}

単にセッションを取得して、閉じてるだけです。


ライブラリとしては以下のものを置いています。

antlr-2.7.2.jar
bsf-2.3.0.jar
commons-beanutils-1.7.0.jar
commons-chain-1.1.jar
commons-collections-2.1.1.jar
commons-digester-1.8.jar
commons-fileupload-1.1.1.jar
commons-io-1.1.jar
commons-logging-1.0.4.jar
commons-validator-1.3.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
jdbc2_0-stdext.jar
jgroups-2.2.8.jar
jstl-1.0.2.jar
jta.jar
oro-2.0.8.jar
standard-1.0.2.jar
struts-core-1.3.8.jar
struts-el-1.3.8.jar
struts-extras-1.3.8.jar
struts-faces-1.3.8.jar
struts-mailreader-dao-1.3.8.jar
struts-scripting-1.3.8.jar
struts-taglib-1.3.8.jar
struts-tiles-1.3.8.jar
xml-apis.jar

です。
_________________
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-13 11:35
NoClassDefFoundErrorはJavaVMが該当クラスを発見できない場合に発生します。
まず確認するのは該当クラスを含むjarファイルにクラスパスが通っているかどうか。
J2EEではWEB-INF/libにjarファイルを置くことで自動的に参照できるようになります。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-04-13 12:08
Struts のライブラリが Web アプリケーションの親クラスローダで読み込まれているとか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-04-13 12:14
ここらへんとか参考になるかもしれません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28912&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15194&forum=12&start=8

>ライブラリとしては以下のものを置いています。
あれ、hibernate の jar ファイルは配置されていなさそうですね。
クラスローダの階層関係とかじゃなくて、nagise さんの仰るとおりライブラリが見つからないだけみたいですね。

[ メッセージ編集済み 編集者: インギ 編集日時 2007-04-13 12:14 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-13 12:24
引用:

インギさんの書き込み (2007-04-13 12:14) より:
あれ、hibernate の jar ファイルは配置されていなさそうですね。
クラスローダの階層関係とかじゃなくて、nagise さんの仰るとおりライブラリが見つからないだけみたいですね。



クラスローダも考えたのですが、スタックトレースが
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
からでしたので違うだろうと推測しました。
ここならAppClassLoaderでしょうから。
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-04-13 12:36
>> nagise さん
回答ありがとうございます。
Hibernate-3.2に含まれるjarファイルを全て入れてみたのですが、それでも同じ結果でした。
同じような現象に悩まされた人いませんかねぇ。
_________________
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-13 13:09
ぐぐると同様のネタはでてきますが…
いくつか見てみましたがやはりクラスパスのようですね。

もうひとつの可能性はインギさんが示されているようにクラスローダの問題。
エラー箇所直前でクラスローダが何かを確認してみるといいかもしれませんね。
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-04-13 13:36
みなさん回答ありがとうございます。

Hibernate-3.2のライブラリをTomcatのsharedの中に入れて試してみたのですが、結果は同じでした。
それと、エラーの直前のクラスローダーを調べてみたのですが、sun.misc.Launcher$AppClassLoader@11b86e7
というふうに出力されました。
_________________

スキルアップ/キャリアアップ(JOB@IT)