メインディレクトリ(main.Javaを含む)とサブディレクトリ(child.Javaを含む)があります。
私の問題は、main.Javaでchild.Javaをインスタンス化する方法です
package mypackage
として追加しましたchild.class
を使用してjavac -d . child.Java
をコンパイルしました。import subdirectory.mypackage.*
(-dオプションはmypackageフォルダー内にchild.classを配置することに注意してください)次のエラーが発生します。
mainAESE.Java:9: cannot access subdirectory.child
bad class file: RegularFileObject[./subdirectory/child
class file contains wrong class: mypackage.child
Please remove or make sure it appears in the correct subdirectory of the class
child childInstance= new child();
^
1 error
私を助けてください!!
パッケージフォルダーmypackage
およびMain.class
親フォルダを共有します。
package mypackage;
public class Child {}
Main
クラスはdefault
パッケージに作成されていると思います。
public class Main {
public static void main(String []args){
mypackage.Child child=new mypackage.Child();
}
}
そしてあなたのディレクトリ構造は次のようになります:
main-directory/
|
|----/mypackage/
Child.class
|
| Main.class
| Main.Java
| Child.Java
Main
を次のコマンドで起動/ロードするには、
Javaメイン
2つのことを行う必要があります。
現在のインポートをimport mypackage.child
に置き換えます
インポートは、インポートするクラスの 完全修飾名 を反映する必要があります。マシン上のクラスファイルの場所とは関係ありません。また、import mypackage.*
を実行して、必要なクラスを個別に指定する代わりに、パッケージmypackage
からすべてのクラスをインポートすることもできます...これはコーディングスタイルの選択にすぎません。
クラスパスにsubdirectory
を追加します
一方、クラスパスは、doesがマシン上のクラスファイルの場所に関係しています。その名前が示すように、JVMがプログラムが使用するクラスを探す必要があるすべての場所へのパスがリストされています。または、オラクルが言うように、 「クラスパスはJDKツールおよびアプリケーションにサードパーティおよびユーザー定義のクラスの場所を指示します。」 指示する必要はありませんJava付属の特殊クラスの場所(String
など)。
#2の手順は、プログラムの実行方法(コマンドラインまたはEclipseなどから)によって異なります。 (コメントごとに)コマンドラインを使用しているため、-classpath
フラグまたはその短縮形である-cp
を使用する必要があります:Java -cp ./subdirectory main
次のファイルがあります。
main.Java mypackage/child.Java
main.Javaでは、最初の行は次のようになります。
import mypackage.child;
main.Javaがあるディレクトリから、実行します
javac mypackage/child.Java
その後:
javac main.Java
mypackageには、child.Javaとchild.classが含まれている必要があります
Javaメインは、mypackageというサブディレクトリで子を探すため、動作するはずです。