Java NoClassDefFoundError与可执行Jar

Java NoClassDefFoundError与可执行Jar,java,classpath,manifest,executable-jar,Java,Classpath,Manifest,Executable Jar,可能是execjar的一个常见问题。我试图创建并运行一个可执行的jar,这让我发疯 我有几个类(带有包stmts),其中一个有一个main方法、一个简单的空构造函数,当然还有几个biz方法,它们构成了一个小型eclipse项目的一部分。 我使用build.xml将这些文件和清单文件捆绑到一个jar(arc.jar)中。我的程序使用jdom库,并且还引用了我的一个其他eclipse项目,因此在构建我的arc.jar时,我同时包含了jdom库和其他biz库 这是我写的Manifest.MF,在Mai

可能是execjar的一个常见问题。我试图创建并运行一个可执行的jar,这让我发疯

我有几个类(带有包stmts),其中一个有一个main方法、一个简单的空构造函数,当然还有几个biz方法,它们构成了一个小型eclipse项目的一部分。
我使用build.xml将这些文件和清单文件捆绑到一个jar(arc.jar)中。我的程序使用jdom库,并且还引用了我的一个其他eclipse项目,因此在构建我的arc.jar时,我同时包含了jdom库和其他biz库

这是我写的Manifest.MF,在Main类之后有一个新的lineafter

Manifest-Version: 1.2  
Class-Path: jdom.jar other.jar
Main-class: uk.co.Art 
当我解压这个arc.jar时,它包含jdom.jar、other.jar、META-INF/Manifest.mf和包含我的类的包。 有趣的是,jar中的清单文件如下所示-

Manifest-Version: 1.2 
Created-By: 14.2-b01 (Sun Microsystems Inc.) 
Main-class: uk.co.Art
Class-Path: jdom.jar other.jar
当主类的值没有包时,我得到了ClassNotFoundException
ClassNotFoundException:uk.co.Art
。使用包时,错误更改为
ClassNotFoundException:org.jdom.jdomeexception

因此,出于测试目的,我尝试使用
c:\
为我的执行类和JAR提供完整路径,但它仍然无法找到主类,errors out
ClassNotFoundException:uk.co.Art

我似乎不明白为什么。
我使用的命令行是-
java-jar Arc.jar

cmd提示符上的版本为-
java版本“1.6.0_16”
Java(TM)SE运行时环境(build 1.6.0_16-b01)
Java HotSpot(TM)客户端虚拟机(构建14.2-b01,混合模式)

而eclipse安装的jre是jre6

你们有什么建议吗

Alex的解决方案确实解决了本地执行的问题。
我还在考虑另一种执行方式(作为额外选项),在服务器上部署Arc.jar并在该机器上运行批处理,该机器基本上设置java类路径,然后以任何方式调用jar或直接调用该类<代码>但这只是一个选项,而不是首选选项。
或者,在我的清单中设置该类路径,在本地构建jar并部署到服务器上。
不过我想尝试一些东西<代码>但现在我明白了基本问题是jar进入jar,因此类路径问题。


非常感谢各位。

也许.jar是腐败的,就像有时发生在我身上一样。看看。

也许.jar已经损坏了,就像有时发生在我身上一样。看一看。

你不能把其他罐子捆绑在一个罐子里。它们必须放在同一个文件夹中,或者至少放在相对于
Arc.jar
的文件夹中。然后在
类路径
条目中指定其相对路径

然而,Eclipse有一个有用的导出工具,它允许您将其他JAR的内容嵌入到您的JAR中,这样您就不会得到需要放置在特定位置的多个松散JAR。选择导出>可运行JAR文件时,请选中第二个库处理选项


当选择将所需库打包到生成的JAR中时,Eclipse将添加一个特殊的类加载器,它将在执行主类之前为您透明地加载这些JAR。它是在的帮助下完成的。

您不能将其他JAR绑定到一个JAR中。它们必须放在同一个文件夹中,或者至少放在相对于
Arc.jar
的文件夹中。然后在
类路径
条目中指定其相对路径

然而,Eclipse有一个有用的导出工具,它允许您将其他JAR的内容嵌入到您的JAR中,这样您就不会得到需要放置在特定位置的多个松散JAR。选择导出>可运行JAR文件时,请选中第二个库处理选项


当选择将所需库打包到生成的JAR中时,Eclipse将添加一个特殊的类加载器,它将在执行主类之前为您透明地加载这些JAR。它是在的帮助下完成的。

您不必将额外的罐子装入罐子中。这些jar应该与应用程序jar位于同一目录中。换句话说:将所有JAR放在一个目录中并运行。一切都会好起来的

理由:想想可执行jar意味着什么。如果您的jar不是“可执行文件”,请按如下方式运行它:

java -cp art.jar;ldom.jar;other.jar uk.co.Art
当您的jar是可执行的时,您可以使用以下命令行:

java -jar art.jar

并没有什么神奇之处:jvm打开manifest并从中获取主类和其他JAR的名称,实际上创建了和第一个命令行类似的命令行。现在您了解了您案例中的所有jar必须位于同一目录中。

您不必将其他jar打包到jar中。这些jar应该与应用程序jar位于同一目录中。换句话说:将所有JAR放在一个目录中并运行。一切都会好起来的

理由:想想可执行jar意味着什么。如果您的jar不是“可执行文件”,请按如下方式运行它:

java -cp art.jar;ldom.jar;other.jar uk.co.Art
当您的jar是可执行的时,您可以使用以下命令行:

java -jar art.jar

并没有什么神奇之处:jvm打开manifest并从中获取主类和其他JAR的名称,实际上创建了和第一个命令行类似的命令行。现在您了解了案例中的所有jar必须位于同一目录中。

导出时需要注意的几点

  • 与项目关联的JRE与将用于运行该项目的JRE一致

  • 请将项目导出到本地驱动器中,然后将其移动到任何共享驱动器中(这解决了我的问题)


  • 谢谢。

    在导出时只需注意几件事

  • 与项目关联的JRE与将用于运行该项目的JRE一致

  • 请将项目导出到本地驱动器中,然后将其移动到任何共享驱动器中(这解决了我的问题)


  • 谢谢。

    您能告诉我们jar的目录结构吗?还有这个类的代码,你能告诉我们这个类的目录结构吗