本章節說明如何設定 Java 建置路徑。建置路徑即是類別路徑, 用於建置 Java 專案 (IJavaProject)。
類別路徑僅是類別路徑項目的陣列 (IClassPathEntry), 用來說明可用的類型。類型可以程式碼或二進位碼形式出現, 而且路徑上項目的次序定義了在建置期間解析類型所用的查閱次序。
Java 建置路徑反映在 Java 專案元素的結構中。 您可以查詢專案以取得其套件片段的根目錄 (IPackageFragmentRoot)。 每一個類別路徑項目都對映至一個或多個套件片段根目錄,它們之中的每一個都另外含有一組套件片段。
建置路徑的這個討論不包括 Java 執行時期路徑,因為您可以從建置路徑個別定義它。 (如果需要執行時期類別路徑的討論,請參閱執行 Java 程式碼。
您可以透過程式設計方式,將 setRawClasspath
用於對應專案的 Java 元素上,以變更專案的建置路徑。
下列程式碼設定專案資源的類別路徑:
IProject project = ... // 取得部分專案資源
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] newClasspath = ...;
javaProject.setRawClasspath(newClasspath, someProgressMonitor);
(附註:使用 "raw" 類別路徑這個詞彙是用來強調以下的事實: 並未解析任何用來說明項目位置的變數。)
Java 建置路徑會保存在專案檔案結構中名為 '.classpath' 的檔案內。 這個檔案的用途在於可藉由透過某些程式碼儲存庫,讓其他人可共用 Java 建置路徑的設定值。 尤其是這個檔案不應以手動方式編輯以免毀損。
您可使用 JavaCore 中所定義的 Factory 方法來定義類別路徑項目。 類別路徑項目可以參照下列任一項:
下列是範例類別路徑項目,表示專案 'MyProject' 的來源資料夾 'src':
IClassPathEntry srcEntry = JavaCore.newSourceEntry(new Path("/MyProject/src"));
下列是範例類別路徑項目,表示 'MyProject' 的類別檔資料夾 'lib':
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("/MyProject/lib"),
null, //沒有程式檔
null, //沒有程式檔
false); //未匯出
下列類別路徑項目具有一個程式碼附件:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("d:/lib/foo.jar"), // 程式庫位置
new Path("d:/lib/foo_src.zip"), //程式檔保存檔位置
new Path("src"), //程式檔保存檔根路徑
true); //已匯出
程式檔保存檔根路徑說明程式檔保存檔內的根目錄位置。 如果設為 null,將以動態方式推斷保存檔的根目錄。
下列類別路徑項目表示必備專案 'MyFramework'。
IClassPathEntry prjEntry = JavaCore.newProjectEntry(new Path("/MyFramework"), true); //已匯出
您可以登錄一個自動執行的類別路徑變數初值設定, 以便在啟動工作區時,經由org.eclipse.jdt.core.classpathVariableInitializer 延伸點呼叫。
下列類別路徑項目表示位置保存在 'HOME' 變數的程式庫。
程式碼附件是使用 'SRC_HOME' 和 'SRC_ROOT' 變數定義的:
IClassPathEntry varEntry = JavaCore.newVariableEntry(
new Path("HOME/foo.jar"), // 程式庫位置
new Path("SRC_HOME/foo_src.zip"), //程式檔保存檔位置
new Path("SRC_ROOT"), //程式檔保存檔根路徑
true); //已匯出
JavaCore.setClasspathVariable("HOME", new Path("d:/myInstall"), null); // 沒有進度
您可以登錄一個自動執行的類別路徑儲存器初值設定, 以便在需要儲存器時,經由 org.eclipse.jdt.core.classpathContainerInitializer 延伸點延遲呼叫。
下列類別路徑項目表示系統類別庫儲存器:
IClassPathEntry varEntry = JavaCore.newContainerEntry(
new Path("JDKLIB/default"), // 儲存器 'JDKLIB' + 提示 'default'
false); //未匯出
JavaCore.setClasspathContainer(
new Path("JDKLIB/default"),
new IJavaProject[]{ myProject }, //'myProject' 的值
new IClasspathContainer[] {
new IClasspathContainer() {
public IClasspathEntry[] getClasspathEntries() {
return new IClasspathEntry[]{
JavaCore.newLibraryEntry(new Path("d:/rt.jar"), null, null, false);
};
}
public String getDescription() { return "Basic JDK library container"; }
public int getKind() { return IClasspathContainer.K_SYSTEM; }
public IPath getPath() { return new Path("JDKLIB/basic"); }
}
},
null);
類別路徑程式檔項目可以指定給排除型樣,以防止在類別路徑看得到來源資料夾中的某些資源。 使用型樣可讓您過濾出資源樹狀結構的指定部分。每一個排除型樣路徑相對於類別路徑項目, 並使用類似於 Ant 的型樣機制。只要外部型樣排除了內部型樣, 排除型樣就可以用來指定巢狀來源資料夾。
如果需要排除型樣的詳細資料,請參閱 getExclusionPatterns()。
Java 專案 API isOnClasspath 在判斷某特定資源是否位於類別路徑之前會先檢查併入及排除型樣。
備註:
IPath sourceFolder = new Path("/MyProject/src"); IPath outputLocation = sourceFolder.append("bin"); IClassPathEntry srcEntry = JavaCore.newSourceEntry( sourceFolder, // 來源資料夾位置 new Path[] { outputLocation }, // 已排除巢狀資料夾 outputLocation); // 輸出位置
類別路徑來源項目也可以指派併入型樣,明確地定義該類別路徑可見的資源。如果未指定併入型樣,則來源項目會併入以這個來源項目路徑,作為根目錄的資源樹狀結構中的所有相關檔案。 指定一或多個併入型樣表示只要併入資源樹狀結構中已指定的部分。 每一個指定的路徑必須是相對路徑, 以相對於這個來源項目路徑的方式解譯。檔案型樣有區分大小寫。 符合一或多個這些型樣的檔案除非遭到這個項目的一或多個排除型樣所排除, 否則會併入對應的套件片段根目錄中。
有關路徑型樣的語法和語意的討論,請參閱 getExclusionPatterns()。
缺乏併入型樣,其語意上相當於明確併入型樣
**
。
Java 專案 API isOnClasspath 在判斷某特定資源是否位於類別路徑之前會先檢查併入及排除型樣。
範例:
src/**
會併入根資料夾 src
的全部檔案。
src/**
和 tests/**
會併入根資料夾 src
和 tests
之下的全部檔案。
src/**
搭配排除型樣
src/**/Foo.java
將併入根資料夾
src
之下除了 Foo.java
以外的全部檔案。