Java Language
Javaコンパイラ - 'javac'
サーチ…
備考
javac
コマンドは、Javaソースファイルをバイトコードファイルにコンパイルするために使用されます。バイトコードファイルはプラットフォームに依存しません。つまり、ある種類のハードウェアとオペレーティングシステムでコードをコンパイルし、Javaをサポートする他のプラットフォームでコードを実行することができます。
javac
コマンドは、Java Development Kit(JDK)ディストリビューションに含まれています。
Javaコンパイラとその他の標準Javaツールチェーンでは、コードに次の制限があります。
- ソースコードは、接尾辞 ".java"
- バイトコードは接尾辞 ".class"を持つファイルで保持されます。
- ファイルシステム内のソースおよびバイトコードファイルの場合、ファイルパス名はパッケージおよびクラスの命名を反映する必要があります。
注意:バイトコードをネイティブコードにコンパイルするジャストインタイム(JIT)コンパイラとjavac
コンパイラを混同しないでください。
'javac'コマンド - はじめに
簡単な例
「HelloWorld.java」に次のJavaソースが含まれていると仮定します。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
(上記のコードの説明については、 「Java言語の使い方」を参照してください。)
次のコマンドを使用して、上記のファイルをコンパイルできます。
$ javac HelloWorld.java
これにより、 "HelloWorld.class"というファイルが生成され、次のように実行されます。
$ java HelloWorld
Hello world!
この例の注意点は次のとおりです。
- ソースファイル名「HelloWorld.java」とは、ソースファイル...内のクラス名と一致する必要があります
HelloWorld
。一致しない場合、コンパイルエラーが発生します。 - バイトコードファイル名 "HelloWorld.class"はクラス名に対応します。 "HelloWorld.class"の名前を変更する場合は、実行しようとするとエラーが発生します。
-
java
を使用してJavaアプリケーションを実行するときは、バイトコードではなくクラス名を指定します。
パッケージを使用した例
最も実用的なJavaコードでは、パッケージを使用してクラスのネームスペースを編成し、誤ったクラス名の衝突のリスクを低減します。
com.example
というパッケージ・コールでHelloWorld
クラスを宣言したい場合、「HelloWorld.java」には次のJavaソースが含まれます。
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
このソースコードファイルは、パッケージの命名規則に対応する構造のディレクトリツリーに格納する必要があります。
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
次のコマンドを使用して、上記のファイルをコンパイルできます。
$ javac com/example/HelloWorld.java
これにより、 "com / example / HelloWorld.class"というファイルが生成されます。つまり、コンパイル後、ファイル構造は次のようになります。
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
----HelloWorld.class
次に、次のようにアプリケーションを実行できます。
$ java com.example.HelloWorld
Hello world!
この例の注意点は次のとおりです。
- ディレクトリ構造はパッケージ名の構造と一致する必要があります。
- クラスを実行するときは、完全なクラス名を指定する必要があります。 「com.example.HelloWorld」は「HelloWorld」ではありません。
- 現在のディレクトリからJavaコードをコンパイルして実行する必要はありません。ここでは説明のためだけにしています。
javacで複数のファイルを一度にコンパイルする。
アプリケーションが複数のソースコードファイルで構成されている場合(ほとんどの場合!)、一度に1つずつコンパイルできます。別の方法として、パス名を列挙して複数のファイルを同時にコンパイルすることもできます:
$ javac Foo.java Bar.java
またはコマンドシェルのファイル名ワイルドカード機能を使用して...
$ javac *.java
$ javac com/example/*.java
$ javac */**/*.java #Only works on Zsh or with globstar enabled on your shell
これにより、現在のディレクトリ内の "com / example"ディレクトリ内のすべてのJavaソースファイル、および子ディレクトリ内の再帰的にそれぞれのJavaソースファイルがコンパイルされます。第3の選択肢は、ソースファイル名(およびコンパイラオプション)のリストをファイルとして提供することです。例えば:
$ javac @sourcefiles
sourcefiles
ファイルには次のものが含まれます。
Foo.java
Bar.java
com/example/HelloWorld.java
注:このようなコードをコンパイルすることは、小さな1人のプロジェクトや一度だけのプログラムに適しています。それを超えると、Javaビルドツールを選択して使用することをお勧めします。また、ほとんどのプログラマーは、組込みコンパイラと "プロジェクト"の増分ビルディングを提供するJava IDE(例: NetBeans 、 eclipse 、 IntelliJ IDEA )を使用します。
よく使われるjavacオプション
javac
コマンドのためのいくつかのオプションがあります
-
-d
オプションは、 ".class"ファイルの書き込み先ディレクトリを設定します。 -
-sourcepath
オプションは、ソースコード検索パスを設定します。 -
-cp
または-classpath
オプションは、外部クラスおよび以前にコンパイルされたクラスを検索するための検索パスを設定します。クラスパスとその指定方法の詳細については、クラスパストピックを参照してください。 -
-version
オプションは、コンパイラのバージョン情報を出力します。
別の例で、コンパイラオプションのより完全なリストについて説明します。
参考文献
以下のための決定的なリファレンスjavac
コマンドがあるためにOracleのマニュアルページjavac
。
別のバージョンのJava用にコンパイルする
Javaプログラミング言語(およびその実行時)は、最初の公開からリリースされて以来、数多くの変更が行われています。これらの変更には、
- Javaプログラミング言語の構文とセマンティクスの変更点
- Java標準クラスライブラリによって提供されるAPIの変更。
- Java(バイトコード)命令セットとクラスファイルフォーマットの変更。
ほとんど例外なく(例えば、 enum
キーワード、いくつかの "内部"クラスへの変更など)、これらの変更は下位互換性があります。
- 古いバージョンのJavaツールチェーンを使用してコンパイルされたJavaプログラムは、再コンパイルせずに新しいバージョンのJavaプラットフォームで実行されます。
- 古いバージョンのJavaで書かれたJavaプログラムは、新しいJavaコンパイラで正常にコンパイルされます。
古いJavaを新しいコンパイラでコンパイルする
新しいJavaプラットフォーム上で古いJavaコードを(再)コンパイルして新しいプラットフォームで実行する必要がある場合は、通常は特別なコンパイルフラグを与える必要はありません。いくつかのケースでは(例えば、 enum
を識別子として使用した場合など)、- -source
オプションを使用して新しい構文を無効にすることができます。たとえば、次のクラスを指定します。
public class OldSyntax {
private static int enum; // invalid in Java 5 or later
}
Java 5コンパイラ(またはそれ以降)を使用してクラスをコンパイルするには、次のものが必要です。
$ javac -source 1.4 OldSyntax.java
古い実行プラットフォーム用にコンパイルする
古いJavaプラットフォーム上で実行するためにJavaをコンパイルする必要がある場合、最も簡単な方法は、サポートする必要がある最も古いバージョンのJDKをインストールし、そのJDKのコンパイラをビルドで使用することです。
また、より新しいJavaコンパイラでコンパイルすることもできますが、複雑です。まず第一に、満足すべき重要な前提条件があります。
- コンパイルするコードは、対象とするJavaのバージョンでは使用できなかったJava言語構成を使用してはなりません。
- コードは、古いプラットフォームでは利用できなかった標準のJavaクラス、フィールド、メソッドなどに依存してはいけません。
- コードが依存するサードパーティライブラリも、古いプラットフォーム用に構築され、コンパイル時および実行時に利用可能でなければなりません。
前提条件が満たされていると、 -target
オプションを使用して古いプラットフォームのコードを再コンパイルすることができます。例えば、
$ javac -target 1.4 SomeClass.java
上記のクラスをコンパイルして、Java 1.4以降のJVMと互換性のあるバイトコードを生成します。 (実際には、 -source
オプションは互換性のある-target
意味するため、 javac -source 1.4 ...
と同じ効果があります。- -source
と-target
の関係については、Oracleのマニュアルを参照してください)。
-source
、単に-target
や-source
を使うと、コンパイラのJDKが提供する標準クラスライブラリに対してコンパイルしていることになります。慎重ではない場合は、正しいバイトコードバージョンを持つクラスで終了できますが、使用できないAPIには依存します。解決策は、 -bootclasspath
オプションを使用することです。例えば:
$ javac -target 1.4 --bootclasspath path/to/java1.4/rt.jar SomeClass.java
ランタイムライブラリの別のセットに対してコンパイルします。コンパイル中のクラスが新しいライブラリに(偶然)依存していると、コンパイルエラーが発生します。