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が、ディレクトリ構造は、ドットで区切られたパッケージ名の要素ごとに1つのサブディレクトリを持つという標準に従う必要があります。

于 2012-05-23T12:04:20.207 に答える