带有可执行jar的NoClassDefFoundError

时间:2010-12-23 13:00:20

标签: java classpath manifest executable-jar

exec jar可能是一个非常常见的问题。我正在尝试创建并运行一个可执行jar,它让我疯狂。

我有几个类(包stmts),其中一个有一个main方法,一个简单的空构造函数和一些简单的biz方法,它们构成了一个小eclipse项目的一部分。
我使用build.xml将这些和清单文件捆绑到jar(arc.jar)中。我的程序使用jdom库以及我的其他一个eclipse项目的引用,所以我在构建我的arc.jar时包括了jdom libray和其他商业库。

这是我写的Manifest.MF,在Main-Class之后有一个新的行

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文件看起来像这样 -

Manifest-Version: 1.2 
Created-By: 14.2-b01 (Sun Microsystems Inc.) 
Main-class: uk.co.Art
Class-Path: jdom.jar other.jar

当Main类的值没有包时,我得到了ClassNotFoundException ClassNotFoundException: uk.co.Art。使用包时,错误更改为ClassNotFoundException: org.jdom.JDOMException 所以出于测试目的,我尝试为我的执行类和罐子提供c:\的完整路径,但仍然无法找到主类,错误输出ClassNotFoundException: uk.co.Art
我似乎无法理解为什么。
我使用的命令行是 - java -jar Arc.jar
cmd提示符下的版本是 -
java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode)

而日食安装的jre是jre6

你们有什么建议?

  

Alex的解决方案确实解决了本地执行的问题   我还想到另一种方式(作为一个额外的选项)执行,在服务器上部署Arc.jar并在该机器上运行批处理,基本上设置java类路径,然后调用jar或直接调用类,无论它是哪种方式作品。 But its only an option, not a preferred one though.
  或者,在我的清单中设置该类路径并在本地构建jar并在服务器上部署   想尝试一些事情。 But now I understand that the basic problem was jars into jar and hence classpath issue.

非常感谢大家。

3 个答案:

答案 0 :(得分:5)

您无法将其他JAR捆绑在JAR中。它们必须放在相同的文件夹中,或者至少放在相对于Arc.jar的文件夹中。然后在Class-Path条目中指定其相对路径。

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

alt text

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

答案 1 :(得分:2)

您无需将额外的罐子装入罐子里。这些jar应该与应用程序jar位于同一目录中。换句话说:将所有罐子放入一个目录并运行。一切都会奏效。

理由:想想可执行jar是什么意思。如果jar不是“可执行文件”,则按以下方式运行:

java -cp art.jar;ldom.jar;other.jar uk.co.Art

当你的jar可执行时,你可以使用以下命令行:

java -jar art.jar

没有魔法:jvm打开清单并从那里获取主类和其他jar的名称,并虚拟创建命令行,就像第一个。现在您了解您案例中的所有罐子必须位于同一目录中。

答案 2 :(得分:0)

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