2011-03-02 172 views
2

我正在研究一個需要構建一個類加載器的Eclipse插件,該類可以訪問Eclipse中項目的類路徑中的所有內容。我有一個IJavaProject,我試圖建立一個網址列表傳遞給一個URLClassLoader的:如何在Eclipse插件中獲取IJavaProject的類路徑作爲文件路徑?

final IClasspathEntry[] resolvedClasspath = javaProject.getResolvedClasspath(true); 
for (IClasspathEntry classpathEntry : resolvedClasspath) { 
    urls.add(classpathEntry.getPath().makeAbsolute().toFile().getCanonicalFile().toURL()); 
} 

但是,任何項目依賴關係(無論是手動添加,或從Maven插件的「Maven依賴」容器)顯示爲只是「file:/ projectName」,而不是絕對路徑。

其他實驗涉及使用javaProject.getAllPackageFragmentRoots(),但這似乎並沒有包含「Maven Dependencies」容器內的項目依賴關係。

回答

5

makeAbsolute()調用不是上下文感知的。它只是增加了一個領先的「/」。

您需要檢查路徑是否爲絕對路徑(IPath.isAbsolute())。如果不是絕對的,則調用IProject.getLocation()以獲取項目根目錄並將這兩個路徑連接起來。

提示:UrlClassLoader將鎖定該類加載器存在期間的所有jar。這可能會導致插件用戶出現問題,因爲他們無法在插件處於活動狀態時刪除或更改JAR。我已經看到了幾個解決方法。最有效的方法是先將罐子複製到臨時位置,然後用副本構建類加載器。然後,您可以監視原始的罐子並更新您的副本和類加載器,而無需鎖定用戶控制的文件。