我对运行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函数的类 - 或者我错了吗?
非常感谢!
答案 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$