17

私は次のように2つのJavaクラスを持っています

App1パッケージなし:

class App1 {
    public static void main(String[] args) {
        System.out.println("App1 hello world...");
    }
}

App2パッケージ内:

package java.java.package1;    
class App2 {
    public static void main(String[] args) {
        System.out.println("App2 hello world...");
    }
}

私はそれらの両方をコンパイルすることができます:

D:\javaTest>javac App1.java

D:\javaTest>javac App2.java

ただし、実行できるのは最初のものだけです。

D:\javaTest>java App1
App1 hello world...

D:\javaTest>java java.java.package1.App2

Exception in thread "main" java.lang.NoClassDefFoundError: java/java/package1/App2
Caused by: java.lang.ClassNotFoundException: java.java.package1.App2
        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: java.java.package1.App2.  Program will exit.

どうすれば実行できますApp2か?

4

5 に答える 5

29

パッケージ名()に一致する適切なディレクトリ階層にソースを配置しD:\javaTest\java\java\package1\App1.java、階層のルート(D:\javaTest)からコンパイル/実行する場合、この問題は発生しません。

D:\javaTest>javac java\java\package1\App1.java

D:\javaTest>java java.java.package1.App1
App2 hello world...

このオプションを使用してコンパイルし-d、クラスを次のようなディレクトリ階層に移動することもできます。

javac -d . App2.java
java java.java.package1.App2

で始まるパッケージ名は使用しないでください。javaそれ以降のバージョンのJDKではSecurityExceptionがスローされます。詳細については、この質問を参照してください。

于 2012-06-14T12:01:16.050 に答える
1

あなたはオプションを入れなければなりません-d directory..なぜなら

クラス ファイルの宛先ディレクトリを設定します。クラスがパッケージの一部である場合、javac はパッケージ名を反映するサブディレクトリにクラス ファイルを配置し、必要に応じてディレクトリを作成します。たとえば、-dc:\myclasses を指定し、クラスの名前が com.mypackage.MyClass の場合、クラス ファイルの名前は c:\myclasses\com\mypackage\MyClass.class になります。

于 2012-06-14T12:17:16.417 に答える
0

App2 は java/java/package1 ディレクトリにある必要があります。Java では、パッケージ名とソース コードのディレクトリが一致する必要があります。コンパイルエラーは出ませんでしたか?

于 2012-06-14T12:04:34.957 に答える