#概要
パッケージ宣言のクラスが参照されているソースファイルを
コンパイルする際にエラーが起き、
コンパイルが出来なかったので、その時の健忘録である。
. #①
├── logics #②
│ └── CalcLogic.java #③
└── main #④
└── Calc.java #⑤
package calcapp.main;
public class Calc{
public static void main(String[] args){
int a = 10;
int b = 2;
int total = calcapp.logics.CalcLogic.tasu(a, b);
int delta = calcapp.logics.CalcLogic.hiku(a, b);
System.out.println("足すと" + total + "、引くと" + delta);
}
}
package calcapp.logics; // ⑥
public class CalcLogic{
public static int tasu(int a, int b){
return (a + b);
}
public static int hiku(int a, int b){
return (a - b);
}
}
④の階層で下記のコマンドを実行。「NG①」
javac Calc.java
しかし、以下のエラーメッセージが表示され、コンパイルできなかった。
Calc.java:7: エラー: パッケージcalcapp.logicsは存在しません
int total = calcapp.logics.CalcLogic.tasu(a, b);
^
Calc.java:8: エラー: パッケージcalcapp.logicsは存在しません
int delta = calcapp.logics.CalcLogic.hiku(a, b);
^
エラー2個
#解決策
javacコマンドを正しいディレクトリの中で実行する。(階層①で実行する)
# ①のディレクトリで実行
javac calcapp/main/Calc.java
javacコマンドは、実行したディレクトリ「直下」にあるパスを検索して、
パッケージ名と同じディレクトリがあれば、それを辿って目的のファイルを見つけるようだ。
もし、なければ、javacコマンドはコンパイルすべきファイルを見つけることができない。
「NG①」で、パッケージを見つけることができなかった理由としては、
階層④でjavacコマンドを実行しても、
javacコマンドは、階層④「直下」にあるパスから、
「./calcapp/logics」探そうとしていたからである。
#備考
ちなみに、今、問題となっているのは、
Calc.javaをコンパイルする際に、パッケージが記載されたクラスが使われていた(パッケージが記載されたクラスの記載があった)場合である。
(Calc.javaのソースファイルに記載されているパッケージ宣言(※⑥の表記)の事ではない。)
つまり、パッケージとjavaファイルを探す際に、Javacコマンドを実行するディレクトリとパッケージに対応するディレクトリを正常に配置していないと、Javacコマンドが該当ファイルを見つけることができないのである。)
実際、Calc.javaがたとえ、calcapp.mainパッケージに属していたとしても、そのパッケージ内で、パッケージが参照されていなければ、階層④でjavacコマンドを実施しても、正常にクラスファイルが作成される。
ただし、その場合も、javaコマンドを実行する際には、
同じように、実行ディレクトリ(※Javaコマンドをどのディレクトリで実行するか)と
パッケージに対応するディレクトリから該当classファイルを見つけていくので、
javaコマンドを実行するディレクトリと、パッケージに対応するディレクトリの構成を
正しくしておかなければ、クラスファイルを見つけることができない。(プログラムが起動しない。)
#参考文献
『スッキリわかるJava入門 第2版 スッキリわかるシリーズ』-第6章