-2

現在、次のように設定された .java ファイルがあります。

package com.ds;

class c{...}

public class Main{...}

ファイル Main.java をコンパイルすると、単一の .class ファイルが Main.class になります。

.class を実行しようとすると、動作java com.ds.Mainしません! クラスが見つからない、またはクラスをロードできないと表示されます。

.class を実行しようとすると、java Main次のようなエラーが発生します。

Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: com
/DatingService/Main)


at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

解決策を見つけようとしているときにこれを見たことがありますが、見つけた解決策はどれも私には当てはまらないか、単に機能しませんでした。

もう少し調査を行った後、javac は少なくともデフォルトではファイル内のクラスを分割しないと思いますか? Eclipse や IntelliJ などの多くの IDE では、クラスが 2 つの個別の .class ファイルに分割されていることを知っています (これは確認できます)。javacがこれを行う方法はありますか?IntelliJ のコンパイラとして javac を使用しているため、コンパイルする前に行わない限り、方法が必要です。

パッケージを削除すると、コンパイルされた単一の .class ファイルだけで Java Main を完全に正常に実行できます。だから私は少し混乱していて、少し必死です。コードを変更したり、クラスを 2 つの個別の .java ファイルに分割したりすることを完全に避けようとしています。

4

2 に答える 2

1

何が間違っているのかわからないので、それを行う方法を示します。

ディレクトリとファイルがあるとしましょう

[myProject]
  |
  +--[src]
  |    |
  |    +--[com]
  |        |
  |        +--[DatingService]
  |            |
  |            +-- Main.java
  |
  +--[classes]

Main.java ファイルは次のようになります

package com.DatingService;

class c{
    private int i;
    public void setI(int i){
        this.i=i;
    }
    public int getI(){
        return this.i;
    }
}

public class Main{
    public static void main(String[] args){
        c myCVariable = new c();

        myCVariable.setI(10);
        System.out.println(myCVariable.getI());
    }
}

ターミナルでは、myProjectディレクトリに移動し、そこから使用する必要があります

マイプロジェクト>javac -d classes src\com\DatingService\Main.java

(ディレクトリ) パラメーターのおかげ-dで、コンパイルされたすべてのクラスを含むパッケージはディレクトリに配置する必要があります(ディレクトリが既に存在している必要があることにclasses注意してください)。classesしたがってc.classMain.classと に配置されmyProject\classes\com\DatingServiceます。

mainクラスからメソッドを実行Mainするには、パッケージを含むディレクトリ (これは ClassPath) に関する情報を提供し、full.package.name.to.your.MainClass. したがって、コマンドにパラメーターを追加-classpath classes(または短縮) し、次のように実行する必要があります。-cp classesjava

マイプロジェクト>java -cp classes com.DatingService.Main

(注:JVMはファイルからのコードではなく、ファイルに保存されたバイナリを実行しているため、クラスの.java後に接尾辞はありません)Main.class.java

于 2013-10-06T19:49:45.793 に答える
0

-d オプションを使用して、生成されたクラス ファイルを配置する場所を指定します。例えば。プロンプトがある現在のディレクトリにコンパイルする場合は、次を使用します

javac -d . Main.java

現在のディレクトリにフォルダー構造 com/ds が作成され、そこに 2 つのクラス ファイルが配置されます。次に、を使用して実行します

java com.ds.Main
于 2013-10-06T19:19:04.563 に答える