Eclipse 預設採用懶啟動:Plug-in 僅在其類別首次被載入時才啟動。本文透過除錯堆疊追蹤,揭示底層實作——EclipseLazyStarter 掛載於 ClasspathManager 的 ClassLoadingStatsHook。
org.eclipse.core.resources.IContainer)。DefaultClassLoader 委派 BundleLoader、ClasspathManager 尋找類別。ClasspathManager.findLocalClass 遍歷所有 ClassLoadingStatsHook 呼叫 preFindLocalClass。ClassNotFoundException 避免死結。BaseAdaptor,構造函數初始化 HookRegistry。HookRegistry.initialize() 讀取 hookconfigurators.properties,載入所有 HookConfigurator 實作。org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter,其 addHooks 將自身註冊為 ClassLoadingStatsHook。// ClasspathManager.findLocalClass
ClassLoadingStatsHook[] hooks = adaptor.getHookRegistry().getClassLoadingStatsHooks();
for (hook : hooks) hook.preFindLocalClass(classname, this);
result = findLocalClassImpl(classname, hooks);
for (hook : hooks) hook.postFindLocalClass(classname, result, this);
// EclipseLazyStarter.preFindLocalClass
public void preFindLocalClass(String name, ClasspathManager manager) {
if (!needToActivate) return;
if (bundle.isStarting()) wait(5000); // 超時直接報錯
bundle.start(); // 啟動 Plug-in
}
5 秒硬性逾時包含依賴 Plug-in 啟動時間。啟動器避免耗時操作(如資料庫連線、網路呼叫),否則極易觸發 timed out waiting for thread to finish starting bundle 錯誤。建議將初始化延遲至背景執行緒或服務啟動階段。
HookRegistry 尚支援 ClassLoadingHook、BundleFileWrapperFactoryHook、StorageHook、AdaptorHook 等,資源管理(如 CVS、ClearCase 整合)亦大量運用 IMoveDeleteHook 機制。