从命令行创建Jar文件

7
我拥有以下的目录层次结构:
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、mongo-2.7.3.jar和sigar.jar等所需文件(这些文件是与jdk中的bin文件夹一起提供的)。但是,在运行时,我遇到了以下问题:

ClassNotFoundException : SigarTest.SigarMain

我做错了什么?

jar cfe temp.jar SigarTest.SigarMain.class SigarTest/bin.... 尝试执行此命令 - Alpesh Prajapati
@AlpeshPrajapati:这不是我已经做过的吗? - Cygnus
您没有在SigarTest.SigarMain后面添加.class... - Alpesh Prajapati
1个回答

5
使用-C dir选项,该选项会在处理以下inputfiles参数时,在执行jar命令期间暂时更改目录(cd dir)。如果您执行提问中的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)

请注意,将 SigarTest/bin 放置在 temp.jar 中是不正确的。执行 temp.jar 会抛出 ClassNotFoundException 异常,因为 SigarMain 在包 SigarTest.bin.SigarTest 中。现在考虑下面使用 -C dir 选项的 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 异常。


顺便问一下,当你使用-C参数时,目录只会更改跟在目录名后面的文件还是所有跟在该名称后面的值都会更改?根据这个,应该是后者对吧? - Cygnus
1
文档有点令人困惑。通过一些测试,我发现只有一个文件是如下的,这就解释了为什么在-C SigarTest/bin/ . tools.jar中,SigarMain.class来自SigarTest/bin/,而tools.jar来自执行jar命令的目录。您还可以多次指定-C - creemama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接