LoginSignup
3
3

More than 3 years have passed since last update.

javacコマンドでコンパイルするソースファイルを指定する方法(※ソースファイル内に、パッケージ宣言のクラスが参照されている場合)

Last updated at Posted at 2021-03-29

概要

パッケージ宣言のクラスが参照されているソースファイルを
コンパイルする際にエラーが起き、
コンパイルが出来なかったので、その時の健忘録である。

フォルダ階層
. #├── logics #│   └── CalcLogic.java #└── main #    └── Calc.java #
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);
  }
}
CalcLogic.java
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章

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3