在主类中使用包名称会导致NoClassFoundException

时间:2014-06-09 21:46:05

标签: java

我的代码:

//package Foo;
public class Bar{
public static void main(String[] argv){System.out.println("test");}
}

现在,当我编译并运行它时,代码将起作用但是,当我取消注释第一行时,当我尝试使用

运行它时会抛出异常
java Bar

它将抛出以下内容:

java.lang.NoClassDefFoundError: Bar (wrong name: Foo/Bar)
at java.lang.ClassLoader.defineClass1(Native Method)
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$100(Unknown Source)
at java.net.URLClassLoader$1.run(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)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Exception in thread "main" 

当我尝试以这种方式运行时:

java Foo.Bar

我会得到这个:

Error: Could not find or load main class Foo.Bar

当我执行以下操作时将生成相同的输出:

java -classpath ./ Foo.Bar

即使我确实指定了当前路径的完整路径,我认为它不应该是必要的但是我这样做了,我仍然会发出这样的信息:"无法找到或加载..."。

1 个答案:

答案 0 :(得分:4)

添加包Foo时,您还应更改文件夹结构:

 //before:
 ./Bar.java

 //after adding Foo package:
 ./Foo/Bar.java

然后按如下方式运行它:

./java Foo.Bar

(注意:您应该在.目录中,而不是./Foo

检查:http://docs.oracle.com/javase/tutorial/java/package/managingfiles.html

上述链接的引用:

 //in the Rectangle.java file 
 package graphics;
 public class Rectangle {
    ... 
 }
     

然后,将源文件放在名称反映该类型所属包的名称的目录中:

 .....\graphics\Rectangle.java