5

我在 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>

在 Internet 上检查,我将 %CLASSPATH% 变量修改为:

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

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

4

4 回答 4

3

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

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

于 2013-05-15T02:29:00.777 回答
2

尝试 Eclipse 中的以下选项:

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

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

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

于 2013-05-20T11:19:43.283 回答
2

您正在尝试使用命令行启动程序,.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)

它与您在这里的结构相同吗?

于 2013-05-15T04:13:26.810 回答
1

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

于 2013-05-23T09:55:04.557 回答