带有可执行jar的NoClassDefFoundError

Swi*_*tle 1 java manifest classpath 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 
Run Code Online (Sandbox Code Playgroud)

当我解压缩这个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
Run Code Online (Sandbox Code Playgroud)

ClassNotFoundException: uk.co.Art当Main类的值没有包时,我得到了ClassNotFoundException .使用包时错误更改为ClassNotFoundException: org.jdom.JDOMException.
所以只是为了测试目的,我尝试c:\为我的执行类和jar 提供完整路径,但仍然无法找到主类,错误输出ClassNotFoundException: uk.co.Art.
我似乎无法理解为什么.
我使用的命令行是 - java -jar Arc.jar
cmd提示符下的版本是 - 而eclipse安装的jre是jre6
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)

你们有什么人建议的?

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.

非常感谢大家.

Bal*_*usC 6

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

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

替代文字

当选择Package required库到生成的JAR中时,Eclipse将添加一个特殊的类加载器,它将在执行主类之前为您透明地加载这些JAR.它是在帮助下做到的JarRsrcLoader.