尽管提供了一个jar文件,但找不到java类

时间:2010-06-26 19:45:59

标签: java jar

我对运行java程序的过程感到困惑,也许你可以帮忙。

我在~/working_dir/org/project/中有几个具有主要功能的.java文件,我想将它们打包在jar中运行它们。我这样做:

cd ~/working_dir/org/projectname
javac -classpath $CLASSPATH *.java
cd ~/working_dir/
jar cf myjar.jar org/

然后尝试通过执行以下操作来运行jar中的一个类: java -cp myjar.jar org.project.SomeClass

并获取

Exception in thread "main" java.lang.NoClassDefFoundError: org/project/SomeClass
Could not find the main class: org.project.SomeClass

我做错了什么?这些类编译没有任何错误,jar tf myjar.jar表明它们确实在那里。据我所知,我不需要创建一个Manifest文件,因为我提供了我想在运行时运行main函数的类 - 或者我错了吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

如果爆炸的jar org / project / SomeClass位于当前工作目录之下:

/  <- you are here
+---/org
    |
    +-----/project
          |
          +--------SomeClass.class

尝试java -cp。 org.project.SomeClass而不是

答案 1 :(得分:0)

首先,请注意,如果你只是做

javac org/project/SomeClass.java

类文件将在.java文件旁边结束,这使得在jar中只包含.class文件变得棘手。我建议您使用-d选项指定目标目录:

javac -d bin org/project/SomeClass.java

请查看以下bash-session以获取有关其工作的详细信息:

源目录列表:

user@host:/working_dir/src$ ls -R
.:
org

./org:
projectname

./org/projectname:
SomeClass.java

SomeClass.java文件:

user@host:/working_dir/src$ cat org/projectname/SomeClass.java 
package org.project;

public class SomeClass {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

编译它(使用目标目录../ bin)

user@host:/working_dir/src$ javac org/projectname/SomeClass.java -d ../bin

列出结果并确保您的目录正确:

user@host:/working_dir/src$ cd ../bin/
user@host:/working_dir/bin$ ls -R
.:
org

./org:
project

./org/project:
SomeClass.class

创建jar文件:

user@host:/working_dir/bin$ jar cf myjar.jar org

确保您的目录正确,并且不小心包含“bin”目录:

user@host:/working_dir/bin$ jar tf myjar.jar 
META-INF/
META-INF/MANIFEST.MF
org/
org/project/
org/project/SomeClass.class

启动主要方法:

user@host:/working_dir/bin$ java -cp myjar.jar org.project.SomeClass 
Hello World

user@host:/working_dir/bin$