4

是否按照规范,给定一个MyClass.java包含

package com.mycorp.foo;

public class MyClass {
  public static void main (String[] args) {
    System.out.println("Hello, world!");
  }
}

在以下路径中(注意文件夹名称中的点):

./com/mycorp.foo/MyClass.java

以下工作正常:

$ javac com/mycorp.foo/MyClass.java

生产./com/mycorp.foo/MyClass.class,而这不起作用:

$ java com.mycorp.foo.MyClass 
Exception in thread "main" java.lang.NoClassDefFoundError: com/mycorp/foo/MyClass
Caused by: java.lang.ClassNotFoundException: com.mycorp.foo.MyClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
4

2 回答 2

5

类文件顶部提到的打包结构与编译的关系不大,而与运行时类加载有关。

  1. 您可以输入任何包名并编译它。例如下面的java类编译

    package com.sa.test.me.yes.no;
    
     public class Test{
    
     public static void main(String[] args){
    
     System.out.println("Hello");
     }
    
      }
    

即使您没有放入与包声明相同的文件夹结构,它也会编译。您可以通过不放入任何文件夹来测试它(例如java Test.java

2. 类加载时包组织更重要。类加载器将始终根据包结构将类搜索到文件夹中。因此,当您尝试运行程序时,类加载器会尝试根据包结构在文件夹中搜索类文件。

于 2012-05-23T12:24:00.833 回答
1

Oracle 文档指出源树不必匹配目标文件树这一事实。javac出于这个原因,让任何事情都可以进行,但java将要求目录结构遵循以点分隔的包名称的每个元素都有一个子目录的标准。

于 2012-05-23T12:04:20.207 回答