我有一个简单的类
package chapter10;
public class CompilationTest {
public static void main(String[] args) {
System.out.println("HELLO WORLD");
}
}
路径是
Test\src\chapter10\CompilationTest.java
我成功将代码编译到同一个文件夹中,现在我已经
了Test\src\chapter10\CompilationTest.class
但是,当我尝试从同一个文件夹运行时,我收到此错误
>java CompilationTest
Exception in thread "main" java.lang.NoClassDefFoundError: CompilationTest (wrong name: chapter10/CompilationTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: CompilationTest. Program will exit.
当我使用
运行时>java chapter10/PropertiesTest
Exception in thread "main" java.lang.NoClassDefFoundError: chapter10/PropertiesTest
Caused by: java.lang.ClassNotFoundException: chapter10.PropertiesTest
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: chapter10/PropertiesTest. Program will exit.
答案 0 :(得分:7)
该类位于chapter10
包中。从父目录运行它:
java chapter10.CompilationTest
转到父级的原因是Java正在为包含chapter10
文件的CompilationTest.class
目录搜索其包含当前目录的CLASSPATH。您还可以将src目录的绝对路径添加到CLASSPATH以实现相同的效果:
set CLASSPATH=C:\...\Test\src
java chapter10.CompilationTest
或者(显然这是更好的样式)将-cp或-classpath参数添加到java:
java -cp "C:\...\Test\src" chapter10.CompilationTest
答案 1 :(得分:4)
使用java chapter10.PropertiesTest
运行。 Java命令需要完全限定的Java类名,不是字节码文件的路径名。
Java命令通过查看类路径来查找要加载的类。这是要按顺序搜索的目录或JAR文件的列表。使用的算法大致如下:
取该类的完全限定名称,替换“。”带有适用文件分隔符的字符(例如“/”或“\”),并在末尾附加“.class”。结果是路径名。
对于类路径中的每个条目,查找相对于条目的路径名。
如果没有查找成功,请抛出ClassNotFoundException
。
可以使用显式命令行参数(-cp <path>
)设置类路径,也可以从CLASSPATH
环境变量中选择它。如果这些方法中没有设置类路径,则默认类路径为“。”。假设,“。”表示当前目录。
正如@BalusC所说,最佳做法是使用“-cp”参数或创建包装器脚本来启动应用程序。依赖你的shell的$ CLASSPATH是有点不好意思,因为你永远不知道什么时候它可能被覆盖或重置。
(这是一个简化的描述。它不包括“bootclasspath”,在可加载的JAR文件中设置的类路径,从URL加载类,如何处理内部/匿名类等等。)