
―Javaプログラミングの前提知識―
2001/7/13
|
javacコマンドを使いこなす |
|
今回の内容
|
javacコマンドは、Javaプログラムが書かれているソースファイル(.javaファイル)を読み込んで、クラスファイル(.classファイル)を生成するツールです。ソースファイルからクラスファイルを生成することを、コンパイルするといいます。つまり、javacコマンドはJavaプログラムのソースファイルをコンパイルするツールです。このようなツールのことを一般にコンパイラと呼びます。Java言語のCompiler(コンパイラ)なので、javacという名前が付いています。
ソースファイルは、われわれが読んだり書いたりするものであり、クラスファイルは、Java Virtual Machine(Java VM)が内容を理解して、実行するものです。つまり、javacコマンドは、プログラマとJava
VMの間の仲介者であり、Javaでアプリケーションを作成するうえで、最も基本的で重要なツールの1つです。
|
基本的なjavacコマンドの使い方 |
javacコマンドは基本的にDOSプロンプトまたはコマンドプロンプト上で実行します。 javacコマンドを実行するには、DOSプロンプトまたはコマンドプロンプトで、次のように入力します。
javac
上のように、ただjavacとだけ入力すると、javacコマンドの簡単な使い方が表示されます。
もし、簡単な使い方が表示されずに、javacは存在しないなどとエラーメッセージが表示された場合は、環境変数PATHの設定に誤りがある可能性があるので、環境変数PATHの値が正しいかどうか確認してください。
環境変数PATHが正しく設定されているのに、javacが存在しないとエラーメッセージが表示された場合は、次のように入力してみてください。
(Java 2 SDKをインストールしたディレクトリ)\bin\javac
例えば、Java 2 SDKをディレクトリC:\jdk1.3にインストールした場合は、次のように入力します。
C:\jdk1.3\bin\javac
それでもjavacが存在しないというエラーメッセージが表示されるときは、インストールが失敗している可能性があります。また、javacコマンドの簡単な使い方が表示された場合は、環境変数PATHの設定を間違えていないか確認してください。
|
ソースファイルをコンパイルする方法 |
ソースファイルをコンパイルする方法は簡単で、そのソースファイル名をjavacコマンドに指定するだけです。例えば、ソースファイルWordProcessor.javaをコンパイルするには、次のように入力します。
javac WordProcessor.java
WordProcessor.javaが正しいJava言語で書かれていれば、javacはクラスファイルWordProcessor.classを生成します。 javacコマンドは複数のソースファイルを同時にコンパイルすることもできます。例えば、ソースファイルWordProcessor.javaとScheduler.javaを同時にコンパイルするには、以下のように、ソースファイル名を並べて入力します。
javac WordProcessor.java Scheduler.java
また、javacコマンドではワイルドカードを用いてソースファイルを指定することもできます。 例えば、カレントディレクトリ内のすべてのソースファイルをコンパイルするには、次のように入力します。
javac *.java
javacコマンドを実行して、ソースファイルをコンパイルしようとしたのに、クラスファイルが生成されず、エラーメッセージが表示される場合があります。このようにコンパイルが失敗する理由は2つ考えられます。
第1に考えられる理由は、ソースファイルに誤りがあることです。エラーメッセージを参考にして、ソースファイルをもう1度読み直し、誤りがあれば、正しく書き直します。
第2に考えられる理由は、クラスパスの指定が間違っていることです。ソースファイルが参照しているクラスのクラスファイルがクラスパスに存在していない場合にも、クラスファイルは生成されません。このときは、必要なクラスファイルをjavacが見つけられるように、クラスパスを指定してください。例えば、コンパイルしようとしているソースファイルWordProcessor.java中で、クラスライブラリ(特定の目的のために用いられるクラスの集まりのこと)C:\lib\SpellChecker.jarが用いられている場合には、javacコマンドを実行するときに、-classpathオプションを用いて、
javac -classpath .:C:\lib\SpellChecker.jar WordProcessor.java
のように入力して、クラスライブラリをクラスパスに指定しなければなりません。なお、標準システムクラスライブラリや、エクステンション(拡張)メカニズムでインストールしたクラスライブラリを利用する場合には、それらのクラスへのクラスパスを指定する必要はありません。詳しくは、「クラスパス(class
path)を正しく使う」、「エクステンション(拡張)メカニズムとは」を参照してください。
|
依存関係にあるソースファイルの |
javacはファイル間の依存関係を、あくまで簡単にですが、把握し、ソースファイルを自動的にコンパイルします。以下では、その仕組みについて説明します。
まず、javacは、直接コンパイルするよう指定されたソースファイルを解析し、そのソースファイル中で、どんなクラスが使用されているかを調べます。
次に、javacはソースファイル中に使われているクラスを検索します。javacはJava VMのように、ブートクラスパス、エクステンション(拡張)ディレクトリ、クラスパスの順に、クラスファイルを検索しますが、それに加えソースパスを検索し、検索しているクラスに対応するソースファイルがないかどうか調べます。ソースパスについては、オプション-sourcepathの説明を参照してください。
検索の結果、 もし、クラスファイルのみ見つかり、ソースファイルが見つからなかった場合は、単にそのクラスファイルを利用します。もし、ソースファイルのみ見つかり、クラスファイルが見つからなかった場合は、見つかったソースファイルをコンパイルします。
もし、クラスファイルもソースファイルも見つかった場合は、ソースファイルを最後に変更した時刻とクラスファイルを最後に変更した時刻とを比較し、 ソースファイルを最後に変更した時刻がクラスファイルを最後に変更した時刻よりも後であるなら、javacは、クラスファイルがコンパイルされた後に、ソースファイルが変更されたと考えて、そのソースファイルをコンパイルします。
逆に、クラスファイルを最後に変更した時刻がソースファイルを最後に変更した時刻よりも後であるなら、単にそのクラスファイルを利用します。
以上のように、javacは、直接指定されたソースファイルと依存関係にあるソースファイルをある程度自動的にコンパイルします。例えば、以下の2つのソースファイル、Car.javaとEngine.javaを書いて、コンパイルすることを考えてみます。
| public class Car { public Engine engine; } |
| Car.java: |
|
public class Engine { } |
| Engine.java: |
ここで、
javac Car.java
と、javacコマンドにソースファイルCar.javaをコンパイルするように指定すると、javacはソースファイルEngine.javaもコンパイルします。
このときのjavacの動作は以下のとおりです。まず、javacはソースファイルCar.javaを解析します。すると、ソースファイルCar.javaの中で、クラスEngineが利用されていることが分かります。次に、javacはクラスEngineを検索します。具体的には、クラスファイルEngine.classとソースファイルEngine.javaを探します。この場合、クラスファイルは存在せず、ソースファイルEngine.javaのみ存在するので、javacはソースファイルEngine.javaをコンパイルします。
ソースファイルEngine.javaを以下のように書き直したとします。
| public class Engine {
public int horsepower; } |
| Engine.java |
ここで、
javac Car.java
と入力すると、やはり、ソースファイルEngine.javaもコンパイルされます。
このときのjavacの動作は以下のとおりです。まず、javacはソースファイルCar.javaを解析します。すると、ソースファイルCar.javaの中で、クラスEngineが利用されていることが分かります。次に、javacはクラスEngineを検索します。具体的には、クラスファイルEngine.classとソースファイルEngine.javaを探します。今度は、クラスファイルEngine.classもソースファイルEngine.javaも存在しますので、javacはそれらの最終変更時刻を比べます。この場合は、ソースファイルEngine.javaの最終変更時刻の方が後なので、javacはソースファイルEngine.javaをコンパイルします。
以上のように、javacはある程度の依存関係を考慮し、依存関係にあるソースファイルが更新されている場合に、そのソースファイルを自動的にコンパイルします。
しかし、javacによる更新されたソースファイルの自動コンパイルは、非常に単純なものですので、上のようにうまくいく例は極めてまれです(ソースファイルが3つ以上になると、うまく動作しません)。
ですので、この機能には頼らず、更新したソースファイルはjavacでコンパイルした方が無難です。
|
javacコマンドのコマンドラインオプション |
●クラスパスを指定する
| -classpath <クラスパス> |
| javacがソースファイルをコンパイルするときに参照すべきクラスパスを指定するために用います。例えば、第三者が作成したクラスライブラリを利用するようなプログラムを書いた場合、そのクラスライブラリをここで指定する必要があります。クラスパスについては、"クラスパス(class path)とは何ですか"を参照してください。ちなみに、このオプションを指定しない場合は、クラスパスはカレントディレクトリに設定されます |
●クラスファイルの生成先を指定する
| -d <ディレクトリ名> |
| javacに、クラスファイルを<ディレクトリ名>で指定したディレクトリに生成させるために用います |
●ソースファイルを検索するパスを指定する
|
-sourcepath <ソースパス> |
| javacがソースファイルを検索するパスを指定するために用います。このオプションを指定しない場合は、javacはソースファイルをカレントディレクトリから探します。なお、ソースパスの指定方法は、クラスパスの指定方法と同じです |
●デバッグ情報をクラスファイルに追加する
|
-g:<キーワード(のリスト)> |
| デバッグ情報をクラスファイルに追加するためのオプションです。-g:sourceと指定すると、javacはソースファイルのデバッグ情報をクラスファイルに追加します。 -g:linesと指定すると、javacはソースファイル中の行番号のデバッグ情報をクラスファイルに追加します。 -g:varsと指定すると、javacはローカル変数のデバッグ情報をクラスファイルに追加します。 複数種類のデバッグ情報をjavacに生成させるためには、-g:の後ろのキーワードを“,”で区切ります。例えば、ソースファイルの情報と、ローカル変数の情報を生成させるためには、 -g:source,varsのように指定します。単に-gと指定すると、すべてのデバッグ情報がクラスファイルに追加されます。-g:noneと指定すると、javacはデバッグ情報を生成しません。 -gオプションを指定しない場合、javacはソースファイルの情報と、そのソースファイルの行番号の情報をクラスファイルに追加します。つまり、-g:lines,sourceと指定したのと同じ動作をします。 |
●クラスファイルの最適化(現在は無効)
| -O |
| このオプションを指定すると、javacは、クラスファイルを最適化、つまりより効率よく実行できるようにクラスファイルを生成する…ということになっているのですが、現在は、-Oオプションは無効です。つまり、-Oオプションを指定しても、javacの生成するクラスファイルは変化しません |
●警告を出力しない
| -nowarn |
| このオプションを指定すると、javacは警告(Warning)メッセージを出力しなくなります |
●コンパイル情報を表示する
| -verbose |
| このオプションを指定すると、javacが実際にどのような作業を行っているかを知ることができます。具体的には、どのソースファイルをコンパイルしているか、どのクラスファイルを読み込んだか、などの情報が表示されます |
●推奨されないメンバやクラスを表示する
| -deprecation |
| このオプションを指定すると、javacは、ソースファイル中に存在する、推奨されないメンバやクラスについて、その詳細を表示します。 推奨されないメンバやクラスとは、何らかの問題があるために、将来のクラスライブラリの実装ではサポートされないような、メンバやクラスのことです。そのため、推奨されないメンバやクラスを用いたプログラムは、将来のJava VM上では実行できなくなる可能性があります。 このオプションを指定しない場合は、javacは推奨されないメンバやクラスが、ソースファイル中に存在することのみを報告します。 |
●ブートクラスパスを指定する
| -bootclasspath <ブートクラスパス> |
| このオプションは、ブートクラスパスを指定するために用います。ブートクラスパスには標準システムライブラリへのパスを指定します。ブートクラスパスについては、「クラスパス(class path)を正しく使う」を参照してください。 通常はこのオプションを指定する必要はありません |
●エクステンションディレクトリを指定する
|
-extdirs <エクステンション(拡張)ディレクトリ> |
| このオプションは、エクステンションメカニズムの、エクステンションディレクトリを指定するために用います。エクステンションメカニズムについては、「エクステンション(拡張)メカニズムとは」を参照してください。通常はこのオプションを指定する必要はありません |
●実行できるJavaのバージョンを指定する
| -target <バージョン> |
|
このオプションは、クラスファイルがどのバージョンのJava VMで実行できるようにするかを指定します。指定できるバージョンは、1.1、1.2、1.3の3種類です。 1.1を指定すると、バージョン1.1以降のすべてのJava VMで実行できるクラスファイルが生成されます。-targetオプションを指定しなかった場合は、javacは-targetに1.1を指定したのと同じ動作をします。 1.2を指定すると、バージョン1.2以降のJava VMで実行できるクラスファイルが生成されます。 1.3を指定すると、バージョン1.3以降のJava VMで実行できるクラスファイルが生成されます。 通常はこのオプションを指定する必要はありません。 |
●エンコーディングを指定する
| -encoding <エンコーディング指定> |
|
このオプションは、ソースファイルがどのような種類のエンコードで書かれているかを、javacに教えるために用います。このオプションを指定しなければjavacは、オペレーティングシステムの標準の文字コードを使用しているものとして、ソースファイルをコンパイルします。通常はこのオプションを指定する必要はありません |
(補足説明)
-bootclasspath/ -extdirs/ -targetなどのオプションは、ほかのバージョンやほかの仕様のJava VM上で実行するクラスファイルを生成するときに用います。例えば、JDK1.1などの古いJava
VM上や、携帯電話上で動作するようなJava VMで実行するクラスファイルを生成したい場合などにこのオプションが使われます。
ホワイトペーパー(TechTargetジャパン)
- Android NDKでJNIを使用してアプリを高速化するには (2010/3/17)
C/C++やOpenGL ESといったネイティブコードを使うためのNDKとJNIを紹介し、その使い方や注意点を徹底解説します - 調査の難しい「OutOfMemoryError」事例、5選 (2010/3/11)
Java開発者が避けて通れないメモリ不足エラーの基本的な問題切り分け方法と発生につながる事例、対処法を解説 - 究極の問題解析ツール、逆コンパイラJD-Eclipseとは (2010/3/8)
ライブラリ内で例外が発生! そのクラスのソースコードを調べたい!! 自動で逆コンパイルしてくれる無料Eclipseプラグインがあります - いまさら聞けない「Webサービス」の常識 (2010/2/26)
昨今では企業システムでも使われる「Webサービス」の概念やJava標準のJAX-WSを紹介しJBoss WSでサンプルを作成
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |






