初始 SessionFactory 创建 failed.java.lang.NoClassDefFoundError: org/hiber nate/cfg/Configuration

Posted

技术标签:

【中文标题】初始 SessionFactory 创建 failed.java.lang.NoClassDefFoundError: org/hiber nate/cfg/Configuration【英文标题】:Initial SessionFactory creation failed.java.lang.NoClassDefFoundError: org/hiber nate/cfg/Configuration 【发布时间】:2013-05-09 11:23:00 【问题描述】:

我在 Eclipse 中创建了一个项目并成功执行它(这是一个普通项目,没有 Maven 或 Beans,非常简单),我用该项目创建了一个 .jar 并尝试执行它,但是它抛出以下错误:

C:\Documents\wrapper-windows-x86-64-3.5.19-st\bin>java -cp QuoteHandler.jar stoc
k.view.Main
Initial SessionFactory creation failed.java.lang.NoClassDefFoundError: org/hiber
nate/cfg/Configuration
Exception in thread "Quotes" java.lang.ExceptionInInitializerError
        at stock.controller.HollidayController.<clinit>(HollidayController.java:
25)
        at stock.view.MainThread.run(MainThread.java:57)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
        at stock.controller.HollidayController.<clinit>(HollidayController.java:
22)
        ... 2 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.cfg.Configuration
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 3 more

项目的.classpath文件有:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre7"/>
    <classpathentry kind="lib" path="lib/antlr-2.7.7.jar"/>
    <classpathentry kind="lib" path="lib/dom4j-1.6.1.jar"/>
    <classpathentry kind="lib" path="lib/hibernate-commons-annotations-4.0.1.Final.jar"/>
    <classpathentry kind="lib" path="lib/hibernate-core-4.1.10.Final.jar" sourcepath="lib/hibernate-core-4.1.10.Final.jar"/>
    <classpathentry kind="lib" path="lib/hibernate-entitymanager-4.1.10.Final.jar"/>
    <classpathentry kind="lib" path="lib/hibernate-jpa-2.0-api-1.0.1.Final.jar"/>
    <classpathentry kind="lib" path="lib/javassist-3.15.0-GA.jar"/>
    <classpathentry kind="lib" path="lib/jboss-logging-3.1.0.GA.jar"/>
    <classpathentry kind="lib" path="lib/jboss-transaction-api_1.1_spec-1.0.0.Final.jar"/>
    <classpathentry kind="lib" path="lib/mysql-connector-java-5.1.20-bin.jar"/>
    <classpathentry kind="lib" path="lib/org.springframework.beans_3.1.4.RELEASE.jar"/>
    <classpathentry kind="lib" path="lib/org.springframework.web_3.1.4.RELEASE.jar"/>
    <classpathentry kind="lib" path="lib/org.springframework.context_3.1.4.RELEASE.jar"/>
    <classpathentry kind="lib" path="lib/joda-time-2.2.jar"/>
    <classpathentry kind="lib" path="lib/c3p0-0.9.1.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

上网查,我将 %CLASSPATH% 变量修改为:

CLASSPATH = C:\Program Files\Java\jre7\lib;C:\Program Files\Java\jre7\lib\c3p0-0.9.1.jar

所有引用都在项目的构建路径中正确配置并且可以正常工作,但是当我执行 .jar 时它不起作用(所有引用都包含在 jar 中)。我错过了什么?

【问题讨论】:

你使用的java版本是什么? 【参考方案1】:

您在 cmets 中提到使用通配符。通配符仅适用于 JDK 6 onward 。因此,如果您的 JDK 版本低于该版本,它可能无法正常工作(以及在路径中添加所有 jar 的方法)。

【讨论】:

如果你看他的类路径,他正在使用 jre7,所以他应该在这里很好【参考方案2】:

从 Eclipse 中尝试以下选项:

    文件->导出 从向导中选择 Java->可运行的 JAR 文件 点击下一步 选择启动配置:选择带有 main() 方法的类,如果此处不可用,请尝试在 eclipse 中运行一次程序 导出目标:选择 jar 文件的完整路径 库处理:选择第三个“复制所需库...” 点击完成

转到命令提示符并将目录更改为导出的 jar 文件并键入 java -jar .jar

注意事项: 在 java 中,类路径 lib/* 无法解析目录中的所有 jar,您必须手动键入每个 jar 条目。

【讨论】:

好,那么您可以检查 jar 文件中的类路径条目。用winrar(winzip)打开jar文件,进入META-INF目录,查看MANIFEST.MF文件。【参考方案3】:

您正在尝试使用命令行启动程序,.classpath 是 Eclipse 项目用于维护与该项目相关的 jar 列表的文件,与从命令行运行相同的代码无关,那就是为什么你会得到“java.lang.ClassNotFoundException”

查看 .classpath 文件,我认为你的项目结构是这样的:

Proj
|
|---src
|
|---lib

所以为了运行你可以做的代码,

对于窗户:

java -cp lib/*;/path/to/your/jar/QuoteHandler.jar stock.view.Main

对于 UNIX:

java -cp lib/*:/path/to/your/jar/QuoteHandler.jar stock.view.Main

这里有几点需要注意: 如果使用了 -jar 选项,则忽略 -cp 参数。

1. So you have two options, modify the manifest file to include the classpath variables
2. Add this jar too in classpath along with other jars as mentioned above, and run the main class.

此外,使用 -cp 基本上会覆盖该会话的环境变量值。 下一次如果你不使用 -cp 开关再次尝试程序,CLASSPATH 的默认值(在环境变量中设置)将被选中。

更新 如果你使用这个命令:

java -cp lib/*;QuoteHandler.jar stock.view.Main

1. Remove quotes they add no value
2. If I look at the command above it means that, you layout is something like:

 somefolder
 |
 |----QuoteHandler.jar
 |
 |----lib
 |    |
 |    |--- antlr-2.7.7.jar
 |    |--- dom4j-1.6.1.jar
 |    |--- hibernate-commons-annotations-4.0.1.Final.jar
 |    |--- hibernate-core-4.1.10.Final.jar
 |    |---...and so on (NO SUBDIRECTORIES)

和你这里的结构一样吗?

【讨论】:

我使用了这个java -cp "lib/*;QuoteHandler.jar" stock.view.Main并显示相同的错误,我什至在C中创建了一个名为C:\classes的文件夹并将其作为Classpath变量作为C:\Program Files\Java\jre7\lib;C:\classes,什么也没有。【参考方案4】:

当您在使用-cp 运行程序时明确指定类路径时,您会覆盖默认的 CLASSPATH os 变量。

因此,您需要将所有需要的类/jar 指定为-cp 中的列表,或者您需要修改您的 CLASSPATH 以获得您的 jar 目录。这个问题Setting multiple jars in java classpath 描述了设置多个类路径元素。

【讨论】:

我使用了这个 java -cp "lib/*;QuoteHandler.jar" stock.view.Main 并显示了同样的错误,我什至在 C 中创建了一个名为 C:\classes 的文件夹并将其放在 Classpath变量为 C:\Program Files\Java\jre7\lib;C:\classes,什么都没有。 上述方法不起作用的唯一原因是,如果您在调用java -cp 时位于错误的目录中,或者文件不在您认为的位置。只需确保您站在一个文件夹中,该文件夹同时包含 QuoteHandler.jar 和一个 lib 文件夹,其中包含运行命令时所需的所有 jars

以上是关于初始 SessionFactory 创建 failed.java.lang.NoClassDefFoundError: org/hiber nate/cfg/Configuration的主要内容,如果未能解决你的问题,请参考以下文章

NoSuchBeanDefinitionException 如何初始化 SessionFactory bean?

Mybatis之SessionFactory原理

SessionFactoryTransactionQuery

Hibernate问题浅析

Hibernate的核心接口

Hibernate的核心接口