尽管提供了jar文件,但未找到java类

尽管提供了jar文件,但未找到java类,java,jar,Java,Jar,我对运行java程序的过程感到困惑,也许你能帮我 我在~/working\u 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.

我对运行java程序的过程感到困惑,也许你能帮我

我在
~/working\u 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
表明它们确实存在。据我所知,我不需要创建清单文件,因为我提供了我希望在运行时从中运行主函数的类——或者我错了


非常感谢您的帮助

如果分解的jar org/project/SomeClass位于当前工作目录下:

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

/首先,请注意

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

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

./org:
projectname

./org/projectname:
SomeClass.java
user@host:/working_dir/bin$ jar tf myjar.jar 
META-INF/
META-INF/MANIFEST.MF
org/
org/project/
org/project/SomeClass.class
查看以下bash会话以了解使其工作的详细信息:

源目录的列表:

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

./org:
projectname

./org/projectname:
SomeClass.java
user@host:/working_dir/bin$ jar tf myjar.jar 
META-INF/
META-INF/MANIFEST.MF
org/
org/project/
org/project/SomeClass.class
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$ 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”目录:

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

./org:
projectname

./org/projectname:
SomeClass.java
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$ 

您的org.project.SomeClass.java文件是否有
包org.project语句在顶部?尝试列出
jar tf myjar.jar的输出。要找到org.project.SomeClass,必须存在一个org/project/SomeClass.class条目(具有确切的名称)是的,它有一个
包org.project语句,
jar tf myjar.jar
将其显示为org/project/someclasss感谢您的详细说明。这和我以前想的差不多(除了没有一个单独的bin/文件夹),但这次它起了作用——我第一次肯定犯了一些小但关键的错误。