JDT 外掛程式包含一個漸進式和批次的 Java 編譯程式,可從原始碼建置 Java .class 檔案。 此編譯程式未提供直接的 API。它會安裝成 Java 專案中的一個建立器。編譯是以標準的平台建置機制來觸發。
有關平台建置機制的詳述,請參閱資源建立器。
您可以程式設計的方式使用建置 API 來編譯專案中的 Java 原始檔。
IProject myProject; IProgressMonitor myProgressMonitor;myProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, myProgressMonitor);
對於 Java 專案,這會呼叫 Java 漸進式專案建立器(以及任何已新增至專案之建置 規格內的其他漸進式專案建立器)。所產生的 .class 檔會寫到指定的輸出資料夾中。 如果建置了完整批次,則會清除輸出資料夾中的所有 .class 檔,以確保沒有過時的檔案。 請確定您是將所有 .class 檔(這些檔案沒有對應的原始檔), 放在類別路徑中的個別類別檔資料夾中,而非放在輸出資料夾中。
其它資源檔案可複製到輸出資料夾中。您可以使用資源過濾器來控制要複製哪些資源檔案。
舉例來說,如果要過濾副檔名為 '.ignore' 的檔案以及 'META-INF' 名稱的資料夾,請使用:
Hashtable options = JavaCore.getOptions();
options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
JavaCore.setOptions(options);
當檔案名稱符合所提供的型樣之一,即會加以過濾。如果資料夾的名稱符合所提供的資料夾名稱(尾端為一個路徑分隔字元)之一, 則會過濾整個資料夾。
您也可以將漸進式和批次式建立器配置成當 .classpath 檔中有錯誤時只產生一個錯誤。 依預設會設定此選項, 且會省略大部份的錯誤(這些錯誤通常是因遺漏 JAR 檔所致)。 請參閱 JavaCore 的 CORE_JAVA_BUILD_INVALID_CLASSPATH 選項。
<?xml version="1.0" encoding="UTF-8" ?>有關 javac Ant 作業的語法,可在 Ant javac 作業文件中找到。目前的配接器可支援 Javac Ant 作業 1.4.1。1.5 版會在 出版 Ant 1.5 時提供。
<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>
JDT Core 會定義一個 private 的標示元(標示元類型 "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
IWorkingCopy workingCopy = (IWorkingCopy)unit.getWorkingCopy(null, null, problemRequestor);
((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");
// trigger reconciliation
workingCopy.reconcile(true, null);
您可以在 acceptProblem(IProblem)
方法中針對所報告的問題新增一項動作。在本例中,
所報告的問題為 Zork 無法解析,或不是有效的超類別,
且其 ID 為 IProblem.SuperclassNotFound。