2012-06-28 21 views
7

创建jar文件我有以下目录结构:命令行

SigarTest 
src 
    SigarTest 
    .java files 
bin 
    SigarTest 
    .class files 

这里,SigarTest是包名。根文件夹位于jdk的bin文件夹中。 从那里,即时通讯运行以下命令来创建我的项目的jar文件 -

./jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 

在需要的tools.jar,蒙戈-2.7.3.jar和sigar.jar,并在同一个文件夹中根目录(jdk的bin文件夹)。然而,在运行它,我得到

ClassNotFoundException : SigarTest.SigarMain 

我做错了什么?

+0

jar cfe temp.jar SigarTest.SigarMain.class SigarTest/bin ....尝试他的 –

+0

@AlpeshPrajapati:与我所做的相同吗? – Cygnus

+0

你还没有添加.class之后SigarTest.SigarMain ... –

回答

5

使用-Cdir option其中

jar命令的执行过程中,暂时改变目录(cdDIR)处理下列inputfiles参数。

如果您在执行您的问题jar命令,并列出temp.jar的内容,你会看到类似以下的输出:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/bin/ 
SigarTest/bin/SigarTest/ 
SigarTest/bin/SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: SigarTest/SigarMain 
Caused by: java.lang.ClassNotFoundException: SigarTest.SigarMain 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

注意,在temp.jar有SigarTest /箱是不正确的。执行temp.jar会抛出ClassNotFoundException,因为SigarMain位于程序包中。现在考虑使用-CDIR选项以下jar命令:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain -C SigarTest/bin/ . tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/ 
SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 

SigarMain是正确的包和执行temp.jar不会引发ClassNotFoundException

+0

谢谢!这解决了:) – Cygnus

+0

顺便说一句,当你做-C时,目录名称后面的文件或所有跟随该名称的值的文件是否已更改目录?据此,应该是后者的权利? – Cygnus

+1

这个文档有点混乱。从一些测试中,我发现它只是下面的一个文件,这解释了为什么在'-C SigarTest/bin /中。 tools.jar','SigarMain.class'取自'SigarTest/bin /','tools.jar'取自'jar'执行的目录。您也可以多次指定'-C'。 – creemama