1
1

Javaコマンドでクラスパス指定時に注意すること

Posted at

前提

Windows11を使用しています
ディレクトリの指定は相対パスで行います

構成

例えば以下のディレクトリ構成を想定します

H:\Java
H:\Java
├─B
│  │
│  └─Y
│          Sub.java
│
├─C
│  │
│  └─Z
│          Base.java
│
└─A    
    │
    └─X
            Main.java            

それぞれのコードの実装は以下の通りです

H:\Java\A\X\Main.java
package X;

import Y.Sub;
import Z.Base;

public class Main {
    public static void main(String[] args) {
        new Sub().Message();
        new Base().Run();
    }
}
H:\Java\B\Y\Sub.java
package Y;

public class Sub {
    public void Message() {
        System.out.println("a");
    }
}
H:\Java\C\Z\Base.java
package Z;

import Y.Sub;

public class Base {
    public void Run() {
        System.out.println("b");
        new Sub().Message();
    }
}

コンパイル

これらのコードを実行するには、まずコンパイルによって.classファイルを作ります
クラスパスにはimport文にてパッケージ名として採用されたフォルダを含むフォルダをトップディレクトリとして指定します

コマンドプロンプト
H:\Java>javac A\X\Main.java -cp B;C
PowerShell
H:\Java>javac A\X\Main.java -cp B";"C

今回であればパッケージY,ZフォルダB,Cに属するフォルダです

H:\Java\A\X\Main.java
import Y.Sub;
import Z.Base;
H:\Java\C\Z\Base.java
import Y.Sub;

PowerShell(Windowsのみ?)上では複数のディレクトリを指定時に";"で区切る必要があります
ダブルクオーテーションで囲う必要があることに注意が必要です

javac javaファイル -cp クラスパス;クラスパス...

が、基本構文となります
ここまででディレクトリの状態は以下のようになりました

H:\Java
```:H:\Java
H:\Java
├─B
│  │
│  └─Y
│          Sub.java
│          Sub.class
│
├─C
│  │
│  └─Z
│          Base.java
│          Base.class
│
└─A    
    │
    └─X
            Main.java
            Main.class

実行

Javaコマンドを用いることでコードの実行が可能ですが、ファイルの指定方法には次の二つの種類があります

Javaコマンド
java -cp クラスパス;クラスパス... javaファイル
java -cp クラスパス;クラスパス... classファイル

ここで注意すべきなのがclassファイルを使用するケースです
まず、javaファイルの使用時は以下のように実行します

コマンドプロンプト
H:\Java>java -cp B;C A\X\Main.java
PowerShell
H:\Java>java -cp B";"C A\X\Main.java
結果
a
b
a

実行対象のファイルを指定し、それぞれのパッケージのトップディレクトリを指定する直感的な方法です
では、クラスファイルの指定時はどうなるかというと、以下のような手続きになります

コマンドプロンプト
H:\Java>java -cp A;B;C X.Main
PowerShell
H:\Java>java -cp A";"B";"C X.Main
結果
a
b
a

クラスファイルの使用時は、そのクラスファイルのソースコード内でpackageに指定されたフォルダを含むフォルダをトップディレクトリとしてクラスパスに含める必要があります

H:\Java\A\X\Main.java
package X

という宣言がありました
つまりこのXというフォルダを含んだAクラスパスに含めなければならないということです
A/X.Mainような書き方はできません
ですね

あとがき

クラスファイルを使用して実行する際に忘れがちなポイントなのでまとめました
嵌りどころだと思うのでディレクトリの指定時には常に意識しておきたいところです

1
1
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
1
1