編譯 Java 程式碼

JDT 外掛程式包含一個漸進式和批次的 Java 編譯器,可從原始碼建置 Java .class 檔案。 此編譯器未提供直接的 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 檔中有錯誤時只產生一個錯誤。 依預設會設定此選項,而且它會消除大部份的錯誤。如需建置器相關選項及其預設值的完整清單, 請參閱 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);

使用 ant javac 配接器

您可使用 javac 配接器,而在 Ant Script 內使用 Eclipse 編譯器。 如果要使用 Eclipse 編譯器,您只需在 Script 中定義 build.compiler 內容即可。請見下列的小範例。
<?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.5 版會在 出版 Ant 1.5 時提供。

問題判斷

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

Copyright IBM Corporation and others 2000, 2003. All Rights Reserved.