Eclipse PDE (Plug-in Development Environment) 內建 API Tools,協助開發者管理 API 生命週期:偵測二進位不相容、自動調整版本號、維護 @since 標籤、限制 API 使用方式(@noimplement 等)、識別非 API 代碼洩漏。本文以 Eclipse 3.4 (Ganymede) 為基礎介紹核心功能與實作範例。
依命名慣例與 MANIFEST.MF 匯出套件決定:
| 元素類型 | 定義 |
|---|---|
| API 套件 | 至少含一個 API 類別/介面的已匯出套件 |
| 內部套件 | org.eclipse.xyz.internal.*,標記 x-internal:=true,可用但不保證相容 |
| API 類別/介面 | API 套件中的 public 類別/介面,或被其宣告/繼承的 public/protected 成員 |
| API 方法/建構子 | API 類別中宣告/繼承的 public/protected 方法/建構子 |
| API 欄位 | API 類別中宣告/繼承的 public/protected 欄位 |
訪問內部套件會收到「阻止訪問」警告,意味著代碼可能變更且無官方支援。
@since 標籤@noimplement 等)MANIFEST.MF 定義 Bundle 間套件可見性| 註解 | 適用元素 | 效果 |
|---|---|---|
@noimplement | 介面 | 客戶端不可 implements/extends |
@noextend | 類別 | 客戶端不可 extends |
@noinstantiate | 類別 | 客戶端不可實例化(任何建構子) |
@nooverride | 方法 | 客戶端不可 override |
@noreference | 方法/建構子/非 final 欄位 | 客戶端不可直接呼叫/引用 |
// IWidget.java
package org.eclipse.example.widgetfactory;
/** @noimplement */
public interface IWidget {
String getName();
long getId();
}
// AbstractWidget.java
public abstract class AbstractWidget implements IWidget {
/** @nooverride */
public long getId() { return Math.round(Math.random()); }
}
// DefaultWidget.java
/** @noextend */
public class DefaultWidget extends AbstractWidget {
public String getName() { return "The default widget"; }
}
// MyWidget.java - 警告:實作了 @noimplement 介面
public class MyWidget implements IWidget { ... }
// MyDefaultWidget.java - 警告:擴展 @noextend 類別、覆寫 @nooverride 方法
public class MyDefaultWidget extends DefaultWidget {
@Override public long getId() { return 42; }
}
修改 API 方法簽名(如 findEntry(String) → findEntry(String, boolean))會被標記為錯誤。可在 Preferences → API Tools 配置檢查規則。
遵循 OSGi major.minor.service.qualifier:
新增方法時,API Tools 報告錯誤並提供 Quick Fix:更新 MANIFEST.MF 版本號(如 3.3.0 → 3.4.0)與方法 @since 3.4。
支援 Headless Build:org.eclipse.pde.api.tools 提供 Ant Task 生成 API Baseline 與違規報表,適合 CI 整合。
API Tools 將「API 設計契約」從文檔落實為「編譯期/建構期強制規則」。核心價值:預防性偵測破壞性變更、自動化版本管理、明確傳達使用限制。對於發佈給第三方使用的 Eclipse Plugin/Feature,強烈建議啟用並納入 CI 流程。