Java コンパイラのオプションを実際に使ってみよう。

前回少し説明したようにJavaでは、必要なファイルを一箇所にまとめられない場合、コンパイラのオプションを使わないと、コンパイルやプログラムの実行ができないことがあります。

今回は実際の例でオプションの使い方を試してみましょう。ポイントはコマンドプロンプトを使うときに、今どこがカレントディレクトリ(現在作業しているディレクトリ)になっているのか、またソースファイルやクラスファイルがどこにあるのか考えながら行うことです。


【1】sample12 フォルダをフォルダごとコピーして、sample14 フォルダを作ります。

java-280.gif


【2】sample14 フォルダと同じ階層に pathTest フォルダを作ります。

java-281.gif

*Javaのツールはカレントディレクトリにはパスが通り認識します。しかしカレントディレクトリ以外は認識できません。

ここでsample14 フォルダと pathTest フォルダが同じ階層にあるということは、pathTestをカレントディレクトリにして作業する場合、もう一方のsample14は認識できないことになります。これは大事な点です。


【3】PersonTest.java を pathTest フォルダへ移動します。

java-282.gif


【4】PersonTest.java を移動しました。pathTest フォルダの中は以下のようになります。

java-283.gif


【5】sample14 フォルダの中は以下のようになります。まだクラスファイルがある場合は削除してください。

java-284.gif


【6】test フォルダの中は以下のようになります。まだクラスファイルがある場合は削除して、ソースファイルだけにしてください。

java-285.gif


【7】Person.java、PersonTest.java に変更はありませんが、念のため掲載しておきます。

*「\」はWindowsではエンマークのことです。

保存先 C:\java\sample14\net\pgtop\test
ファイル名 Person.java

package net.pgtop.test;

public class Person {
  private String name;
  private int age;
  private String address;

  public Person(String _name, int _age, String _address) {
    name = _name;
    age = _age;
    address = _address;
  }

  public void say(){
    System.out.println("私の名前は" + name + "です。年齢は"
    + age + "才で、住所は" + address + "です。");
  }

  public void setName(String _name){
    name = _name;
  }

  public void setAge(int _age){
    if (_age > 0) {
      age = _age;
    }else{
      age = 0;
    }
  }

  public void setAddress(String _address){
    address = _address;
  }

  public String getName(){
    return name;
  }

  public int getAge(){
    return age;
  }

  public String getAddress(){
    return address;
  }

}



保存先 C:\java\pathTest
ファイル名 PersonTest.java

import net.pgtop.test.Person;

public class PersonTest {
  public static void main(String[] args) {

    Person[] people = new Person[2];
    people[0] = new Person("太郎", 21, "東京都港区");
    people[1] = new Person("花子", 18, "北海道札幌市");

    System.out.println("----- say()メソッドで表示");

    for(int i = 0; i < people.length; i++){
      people[i].say();
    }

    //セッターでデータを設定
    people[0].setName("次郎");
    people[0].setAge(-15);
    people[0].setAddress("福岡県福岡市");
    people[1].setName("桃子");
    people[1].setAge(-25);
    people[1].setAddress("宮城県仙台市");

    System.out.println();
    System.out.println("-----ゲッターでデータを取得して表示");

    for(int i = 0; i < people.length; i++){
      System.out.println(people[i].getName() + " "
        + people[i].getAge() + " " + people[i].getAddress() );
    }

  }
}



【8】コマンドプロンプトを起動して、カレントディレクトリを pathTest に切り替えます。

java-286.gif


【9】javac PersonTest.java と入力し、コンパイルします。

java-287.gif

*PersonTest.java が pathTest の直下にあるので、普通の方法でコンパイルします。


【10】しかしエラーが表示されます。Personクラスが見つけられないようです。

java-288.gif

*原因はsample14にはパスが通っていないので、Javaのツールが認識できないからです。コンパイルでパスを通すにはオプションの -sourcepath を使います。


【11】javac -sourcepath c:\java\sample14 PersonTest.java と入力し、コンパイルします。

java-289.gif


【12】パスを通したので今度は上手くコンパイルできました。

java-290.gif


【13】java PersonTest と入力し、プログラムを実行します。

java-291.gif

*PersonTest.class が pathTest の直下にあるので、普通の方法で実行します。


【14】しかしエラーが表示されます。Personクラスが見つけられないようです。

java-292.gif

*これも原因は同じで、sample14にはパスが通っていないので、Javaのツールが認識できないからです。実行の時にパスを通すにはオプションの -classpath を使います。

【15】java -classpath c:\java\sample14 PersonTest と入力し実行します。

java-293.gif


【16】まだエラーが表示されます。今度は PersonTest が見つからなくなりました。

java-294.gif

*実は -classpath を使ってパスを通すと、カレントディレクトリのパスが外されてしまいます。なのでカレントディレクトリへもパスを通す必要があります。


【17】java -classpath c:\java\sample14;c:\java\pathTest PersonTest と入力し実行します。

java-295.gif


【18】やっとプログラムの実行結果が表示されました。

java-296.gif


【解説】

パスを通すということは、コンピュータにファイルの場所を教えてあげることです。

(1)コマンドプロンプトで現在作業中のディレクトリにはパスが通ってますのでJavaのツールが認識できます。


(2)コンパイル時に他のディレクトリにパスを通すには、オプションの -sourcepath を使います。


(3)プログラム実行時に他のディレクトリにパスを通すには、オプションの -classpath を使います。しかし他のディレクトリにパスを通すと、カレントディレクトリのパスが外れますので、カレントディレクトリにもパスを通します。ディレクトリは絶対パスを「;」で区切り複数指定できます。


(4)Javaのツールが認識できる場所
・C:\jdk\jre\libの中 「rt.jar」が圧縮された標準クラスライブラリです。
・コマンドプロンプトのカレントディレクトリ。
・オプションでパスを通したディレクトリ。
・コンピュータのシステムプロパティで、環境変数で指定したディレクトリ。
・コマンドプロンプトで set を使ってパスを通したディレクトリ。など


今回学んだカレントディレクトリやパスの関係は大事です。今後は統合開発環境の eclipse を使った開発に進みますが、 eclipse ではコンパイルはファイルの保存時に自動的に行われます。裏方でいろいろ助けてくれるので、JDKを使った開発にくらべるとプログラミングがだいぶ楽になります。

しかしクラスパスの設定などは eclipse の画面上で行わなければなりません。そのときに今回学んだ知識が頭の片隅にでも残っていると、設定のときに理解が深まります。「なぜこんな設定をするんだろう?」ということがわかります。


スポンサードリンク

スポンサードリンク






Java初心者入門講座TOPへ