JDT プラグインには、ソース・コードから Java の .class ファイルをビルドするためのインクリメンタル Java コンパイラーおよびバッチ Java コンパイラーが含まれています。 このコンパイラーは、直接 API を提供していません。 直接 API は、Java プロジェクトに対するビルダーとしてインストールされます。 コンパイルは、プラットフォームの標準のビルド・メカニズムを使用して起動されます。
プラットフォームのビルド・メカニズムについては、 「インクリメンタル・プロジェクト・ビルダー」で詳細に説明されています。
ビルド API を使用して、プロジェクトの Java ソース・ファイルをプログラマチックに コンパイルすることができます。
IProject myProject; IProgressMonitor myProgressMonitor; myProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, myProgressMonitor);
Java プロジェクトの場合、このコードにより Java インクリメンタル・プロジェクト・ビルダーが (プロジェクトのビルド・スペックに追加されている他のすべてのインクリメンタル・プロジェクト・ビルダーとともに) 起動されます。 生成された .class ファイルは、指定の出力フォルダーに書き込まれます。 その他のリソース・ファイルも出力フォルダーにコピーされます。
フル・バッチ・ビルドの場合、不整合ファイルが見つからなくなるように出力フォルダー内のすべての .class ファイルが「修正」できます。 これは、JDT コア・ビルダー・オプション (CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER) を使用して制御できます。 このオプションのデフォルトは、出力フォルダーのクリーンです。 このオプションがリセットされていない限り、対応するソース・ファイルがない .class ファイルはすべて、 出力フォルダーではなくクラスパスの別のクラス・ファイル・フォルダーに入れる必要があります。
インクリメンタル・ビルダーおよびバッチ・ビルダーは、
どのリソースを出力フォルダーにコピーするかを制御する他のオプションを使用して構成できます。
次のサンプルは、「.ignore」で終わるファイルと「META-INF」という名前のフォルダーが出力フォルダーにコピーされないようにリソース・フィルターをセットアップする方法を示しています。
Hashtable options = JavaCore.getOptions();
options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
JavaCore.setOptions(options);
指定されたいずれかのパターンにファイル名が一致する場合、ファイル名がフィルターに掛けられます。 フォルダー名が、パス・セパレーターで終わる指定のフォルダー名のいずれかと一致する場合、 そのフォルダー全体がフィルターに掛けられます。
インクリメンタル・ビルダーおよびバッチ・ビルダーは、.classpath ファイルにエラーがあるときに 1 つのエラーのみを生成するように構成することもできます。 このオプションはデフォルトで設定され、多くのエラーを除去します。 ビルダー関連オプションとそのデフォルトの詳細なリストについては、『JDT コア』のビルダー・オプションを参照してください。
コンパイラーは、JavaCore を使用して構成することもできます。 例えば、コンパイル中に見つかるさまざまな種類の問題に使用する重大度を定義できます。 コンパイラー関連オプションとそのデフォルトの詳細なリストについては、『JDT コア』のコンパイラー・オプションを参照してください。
ビルダーまたはコンパイラーのオプションをプログラマチックに構成する場合は、 オプションのスコープを指定する必要があります。 例えば、リソース・フィルターのセットアップが、特定のプロジェクトにのみ適用される場合があります。
Hashtable options = myProject.getOptions(false); // get only the options set up in this project options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/"); myProject.setOptions(options);
バッチ・コンパイラー・クラスは、
JDT コア・プラグインの内部クラスに配置されています。
クラスの名前は、org.eclipse.jdt.internal.compiler.batch.Main です。
これは plugins/org.eclipse.jdt.core_3.2.0.jar
にパッケージされています。3.2 以降、個別にダウンロードして入手できるようになりました。
ファイル名は ecj.jar です。この対応するソースも使用可能です。これを入手するには、download page にアクセスして、セクション 「JDT コア・バッチ・コンパイラー (JDT Core Batch Compiler)」を検索します。この jar にはバッチ・コンパイラーと javac Ant アダプターが含まれています。
このため、スタンドアロンのアプリケーションとして、Eclipse 外部の Ant ビルド内部で使用できます。
java -classpath org.eclipse.jdt.core_3.2.0.jar org.eclipse.jdt.internal.compiler.batch.Main
-classpath rt.jar A.java
または
java -jar org.eclipse.jdt.core_3.2.0.jar -classpath rt.jar A.java
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
compile(String)
メソッドは、Java アプリケーションでバッチ・コンパイラーを起動する場合に便利な方法です。
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
の代わりに、org.eclipse.jdt.internal.compiler.batch.Main.compile("-classpath
rt.jar A.java");
と簡潔に記述することもできます。
背景がオレンジ色の箇所が、推奨のオプションです。
名前 | 使用法 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
クラスパス・オプション | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-bootclasspath <dir 1>;<dir 2>;...;<dir P> | これは、コンパイラーにより使用されるクラス・ファイルのブートストラップに使用されるディレクトリーまたは JAR ファイルのリストです。
デフォルトで、実行中の VM のライブラリーが使用されます。
エントリーは、プラットフォームのパス・セパレーターにより分離されます。 各ディレクトリーまたはファイルでは、「[」と「]」の間でタイプのアクセス規則を指定することができます。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-cp -classpath <dir 1>;<dir 2>;...;<dir P> |
これは、ソース・ファイルのコンパイルに使用されるディレクトリーまたは JAR ファイルのリストです。
デフォルト値は、プロパティー "java.class.path" の値です。
エントリーは、プラットフォームのパス・セパレーターにより分離されます。 各ディレクトリーまたはファイルでは、「[」と「]」の間でタイプのアクセス規則を指定することができます (例えば、[-X] はタイプ X へのアクセスを禁止し、[~X] はタイプ X へのアクセスを非推奨とし、[+p/X:-p/*] はパッケージ p のすべてのタイプへのアクセスを禁止しつつ p/X へのアクセスを許可します)。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-extdirs <dir 1>;<dir 2>;...;<dir P> | これは、拡張 ZIP/JAR ファイルの場所の指定に使用されるディレクトリーのリストです。 エントリーは、プラットフォームのパス・セパレーターにより分離されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-endorseddirs <dir 1>;<dir 2>;...;<dir P> | これは、承認済み ZIP/JAR ファイルの場所の指定に使用されるディレクトリーのリストです。 エントリーは、プラットフォームのパス・セパレーターにより分離されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-sourcepath <dir 1>;<dir 2>;...;<dir P> | これは、ソース・ファイルの指定に使用されるディレクトリーのリストです。
エントリーは、プラットフォームのパス・セパレーターにより分離されます。 各ディレクトリーまたはファイルでは、「[」と「]」の間でタイプのアクセス規則を指定することができます。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-d <dir 1>|none | これは、生成された .class ファイルがダンプされるディレクトリーの指定に使用されます。
省略された場合、パッケージのディレクトリー構造は作成されません。 .class ファイルを全く生成しない場合は、-d none を使用してください。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-encoding <encoding name> | デフォルトのソース・エンコード・フォーマットを指定します (それぞれの入力ソース・ファイル/フォルダー名に、例えば X.java[utf8] のように [<encoding name>] のサフィックスを付けることにより、ファイルごとにカスタム・エンコードを指定することもできます)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
準拠オプション | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-target 1.1|1.2|1.3|1.4|1.5|5|5.0|1.6|6|6.0 | .class ファイルのターゲット設定を指定します。
指定可能な値は以下のとおりです。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.3 | 準拠レベルを 1.3 に設定します。-source 1.3 -target 1.1 を暗黙的に設定します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.4 | 準拠レベルを 1.4 に設定します (デフォルト)。-source 1.3 -target 1.2 を暗黙的に設定します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.5 | 準拠レベルを 1.5 に設定します。-source 1.5 -target 1.5 を暗黙的に設定します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.6 | 準拠レベルを 1.6 に設定します。 -source 1.6 -target 1.6 を暗黙的に設定します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-source 1.3|1.4|1.5|5|5.0|1.6|6|6.0 | これは、コンパイラーによって予想されるソース・レベルを指定するのに使用します。 指定可能な値は以下のとおりです。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
警告オプション | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-warn:allDeprecation |
警告レベルを設定します。 例: -warn:unusedLocal,deprecation 赤色 の部分はデフォルトの設定値です。
-warn:none すべての警告を使用不可にします -warn:<, で区切られた警告> リストされた警告のみを使用可能にします -warn:+<, で区切られた警告> 追加の警告を使用可能にします -warn:-<, で区切られた警告> 指定された警告を使用不可にします
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-nowarn | 警告なし (-warn:none と同等) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-deprecation | -warn:deprecation と同等 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
デバッグ・オプション | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-g[:none|:lines,vars,source] | デバッグの属性レベルを設定します
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-preserveAllLocals | すべてのローカル変数を保持することをコンパイラーに明示的に要求 (デバッグの目的)。 省略した場合、コンパイラーは未使用のローカル変数を除去します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
無視されるオプション (javac オプションとの互換用) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-J<option> | 仮想マシンにオプションを渡す | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-X<option> | 標準外のオプションを指定。 -Xemacs は無視されません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-X | 標準外のオプションを印刷して終了 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-O | 実行時の最適化 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
拡張オプション | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@<file> | ファイルからコマンド行の引数を読み取ります | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-maxProblems <n> | コンパイル単位ごとの問題の最大数 (デフォルトは 100) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-log <filename> | コンパイラーからのすべての出力がダンプされるログ・ファイルを指定します。 これは、バッチ・コンパイラーをデバッグする場合や、バッチのビルドからすべてのエラーおよび警告が含まれたファイルを取得する場合、非常に役に立ちます。 拡張子が .xml の場合、生成されるログは xml ファイルになります。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-Xemacs | emacs スタイルを使用してエラーと警告のロケーションをコンソールおよび通常のテキスト・ログに表示します。
XML ログは、このオプションによって影響を受けません。このオプションをアクティブにすると、With this option
2. WARNING in /workspace/X.java というメッセージが、以下のように表示されます。
/workspace/X.java:8: warning: The method... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-proceedOnError | エラーが起こってもコンパイルを継続し、問題のメソッドまたは型があるクラス・ファイルをダンプします。これが推奨されるのは、エラーが残っていてもそのアプリケーションを実行する必要がある場合のみです。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-verbose | コンソールまたはログ・ファイル (指定された場合) に、アクセス/処理されたコンパイル単位を出力します | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-referenceInfo | 参照情報を計算します。 これは、ビルダーに接続されている場合にのみ有用です。 それ以外の場合、参照情報は役に立ちません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-progress | 進行状況を表示します (-log モード時のみ)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-time | 速度情報を表示します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-noExit | コンパイルの最後に System.exit(n) を呼び出しません (エラーがない場合は n=0)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-repeat <n> | コンパイル処理を <n> 回繰り返します (パフォーマンス分析)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-inlineJSR | JSR バイトコードをインライン化します (target >= 1.5 の場合は暗黙)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-enableJavadoc | javadoc 内部の参照を考慮します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ヘルプ・オプション | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-? -help | ヘルプ・メッセージを表示します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-v -version | コンパイラーのビルド番号を表示します。 これは、バグを報告する場合に非常に有用です。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-showversion | コンパイラーのビルド番号を表示し、継続します。 これは、バグを報告する場合に非常に有用です。 |
d:¥temp -classpath rt.jar -time -g -d d:/tmp
|
d:¥temp およびそのサブフォルダー内のすべてのソース・ファイルをコンパイルします。 クラスパスは、単に rt.jar です。 すべてのデバッグ属性を生成し、生成されたすべての .class ファイルが d:¥tmp にダンプされます。 コンパイラーの速度は、バッチ・プロセスの完了後に表示されます。 |
d:¥temp¥Test.java -classpath d:¥temp;rt.jar -g:none
|
Test.java およびその従属ファイル (ある場合は、d:\temp から従属ファイルを取得します) のみをコンパイルします。クラスパスは d:\temp の後に rt.jar が付きます。これは、すべての必要なクラスが最初に d:\temp、次に rt.jar で検索されるということです。デバッグ属性は生成されず、生成されたすべての .class ファイルが d:\temp にダンプされます。 |
<?xml version="1.0" encoding="UTF-8"?> <project name="compile" default="main" basedir="../."> <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> <property name="root" value="${basedir}/src"/> <property name="destdir" value="d:/temp/bin" /> <target name="main"> <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> <classpath> <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> </classpath> </javac> </target> </project>javac Ant タスクで使用される構文は、 『Ant javac タスク・ドキュメンテーション』にあります。 現行アダプターは、Javac Ant タスク 1.4.1 から 1.6.5 までのバージョンをサポートしています。
1.5.0 より後のバージョンを使用している場合は、コンパイラー固有のオプション指定に、ネストされたコンパイラー引数要素を使用できます。
... <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> <classpath> <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> </classpath> <compilerarg compiler="org.eclipse.jdt.core.JDTCompilerAdapter" line="-1.5 -warn:+boxing"/> </javac> ...
コンパイラーに依存するスクリプトの取得を避けるため、org.eclipse.jdt.core.JDTCompilerAdapter
に設定したコンパイラー引数を使用することを推奨します。
これが設定されない場合、そのスクリプトは Eclipse コンパイラーでのみ使用可能です。
設定されると、build.compiler
プロパティーによって指定されたコンパイラー名と名前が異なる場合に、ネストされたコンパイラー引数は無視されます。
JDT コアは、コンパイルの問題を示すための特別なマーカー (org.eclipse.jdt.core.problem というマーカー型) を定義します。 コンパイラーによって検出された問題を方針に基づいて発見するには、 プラットフォームの標準のマーカー・プロトコルを使用する必要があります。 マーカーの使用方法の概要については、 『リソース・マーカー』を参照してください。
以下のコードのスニペットにより、コンパイル単位内のすべての Java 問題のマーカーが検出されます。
public IMarker[] findJavaProblemMarkers(ICompilationUnit cu) throws CoreException { IResource javaSourceFile = cu.getUnderlyingResource(); IMarker[] markers = javaSourceFile.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE); }
Java 問題マーカーは、Java プロジェクト・ビルダーによって保守され、問題が解決されて Java ソースが再コンパイルされると、自動的に除去されます。
問題の ID 値は、 IProblem に定義されているいずれかの定数に設定されます。問題の ID は信頼性のあるものですが、メッセージはローカライズされ、デフォルト・ロケールに応じて変更されます。 IProblem に定義されている定数は自己記述です。
IProblemRequestor
の実装は、Java 操作中に検出された問題を収集するように定義する必要があります。
作業用コピーの作成に
IProblemRequestor
が指定された場合、作業用コピーを問題検出と調整することができます。
これを行うには、reconcile
メソッドを使用できます。以下に例を示します。
ICompilationUnit unit = ..; // get some compilation unit
// create requestor for accumulating discovered problems
IProblemRequestor problemRequestor = new IProblemRequestor() {
public void acceptProblem(IProblem problem) {
System.out.println(problem.getID() + ": " + problem.getMessage());
}
public void beginReporting() {}
public void endReporting() {}
public boolean isActive() { return true; } // will detect problems if active
};
// use working copy to hold source with error
ICompilationUnit workingCopy = unit.getWorkingCopy(new WorkingCopyOwner() {}, problemRequestor, null);
((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");
// trigger reconciliation
workingCopy.reconcile(NO_AST, true, null, null);
acceptProblem(IProblem) メソッドで報告された問題について、アクションを追加することができます。
この例では、報告された問題は、Zork を解決できないか、または有効なスーパークラスではないということと、問題の
ID が IProblem.SuperclassNotFound であるということです。
SuppressWarnings
を使用しての警告の排除Java 5.0 では、注釈 java.lang.SuppressWarning
を使用して、コンパイル・ユニットのサブセットに関するコンパイル警告を使用できないようにするオプションをユーザーに提供しています。
@SuppressWarning("unused") public void foo() { String s; }
注釈を使用しない場合、コンパイラーはローカル変数 s
が使用されないことを指摘します。
注釈を使用する場合、コンパイラーは foo
メソッドに対して、この警告をローカルに無視します。これにより、同じコンパイル・ユニットまたは同じプロジェクトのほかのロケーションで警告を保持できます。
SuppressWarning
注釈内で使用可能なトークンのリストは次のとおりです。