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.
非常感谢大家。
答案 0 :(得分:5)
您无法将其他JAR捆绑在JAR中。它们必须放在相同的文件夹中,或者至少放在相对于Arc.jar
的文件夹中。然后在Class-Path
条目中指定其相对路径。
当选择将所需的包打包到生成的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。