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

时间:2013-05-15 02:19:44

标签: java hibernate jar cmd sessionfactory

我在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中)。我错过了什么?

4 个答案:

答案 0 :(得分:3)

当您使用-cp运行程序时专门指定类路径时,将覆盖默认的CLASSPATH os变量。

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

答案 1 :(得分:2)

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

查看.classpath文件,我认为您的项目结构如下:

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

因此,为了运行您可以执行的代码,

对于Windows:

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将基本上覆盖该会话的Environment Variable值。 如果再次尝试没有-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)

你在这里的结构是否相同?

答案 2 :(得分:2)

从Eclipse中尝试以下选项:

  1. 文件&GT;导出
  2. 从向导中选择Java-&gt; Runnable JAR文件
  3. 点击下一步
  4. 选择启动配置:选择带有main()方法的类,如果它在这里不可用,那么尝试在eclipse中运行一次程序
  5. 导出目标:选择jar文件的完整路径
  6. 图书馆处理:选择第三个“复制所需的库...”
  7. 点击完成
  8. 转到命令提示符并将dir更改为导出的jar文件并键入 java -jar&lt; exported_jar&gt; .jar

    一个注意事项: 在java for classpath中,lib / *不能解析为目录中的所有jar,你必须手动输入每个jar条目。

答案 3 :(得分:1)

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