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

私は何が間違っているのですか?

4

1 に答える 1

5

-C dirオプションを使用します。

次のinputfiles引数の処理中に、コマンドの実行中にディレクトリ ( cd dir ) を一時的に変更します。jar

質問のコマンドを実行してjartemp.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/bin があるのは正しくないことに注意してください。temp.jar を実行すると、ClassNotFoundExceptionsince SigarMainis in package がスローされますSigarTest.bin.SigarTestここで、 dirオプションjarを使用する次のコマンドを検討してください。-C

$ 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.

于 2012-06-28T12:06:50.393 に答える