2011-01-28 104 views
7

我正在研究需要在編譯時不知道的類的Eclipse插件。這些類以jar文件的形式通過網絡發送。我想在運行時動態加載這些類。在運行時將jar添加到Eclipse插件

我試圖在這裏列出的方法:http://blog.imaginea.com/making-applications-work-together-in-eclipse/

遺憾的是它並沒有收到預期的效果。雖然這些類確實被加載了,但是我不能在我加載它們的函數之外使用它們。我猜測它與使用不同的類加載器有關。

任何幫助表示讚賞。即使你告訴我,這是不可能的,所以我知道我不必再看了。

回答

5

如果你讓那些罐子到OSGi包(即,給他們一個MANIFEST.MF),那麼你可以動態地將它們安裝到OSGi運行時。

如果添加一個包激活你的插件,那麼你可以存儲org.osgi.framework.BundleContext,然後你可以這樣做:

Bundle [] newBundle = new Bundle[] { bundleContext.install(location, newJarInputStream) }; 
    packageAdmin.refreshPackages(newBundle); 
    packageAdmin.resolveBundles(newBundle); 

packageAdmin是org.osgi.service的一個實例。 packageAdmin.PackageAdmin這是您可以獲得的服務BundleContext#getService

新罐子可以是完整的捆綁包,也可以是以您的插件作爲其主機的捆綁包碎片。如果它們是你的包的片段,那麼你的包(BundleContext#getBundle())將需要包含在傳遞給refreshPackages和resolveBundles的數組中。

(編輯類加載) Class.forName從你的插件代碼只能找到新安裝的包類,如果你的插件有一個將被新的包來滿足一旦被解析的依賴。

  • 一種方法可以在插件的清單中選擇Import-Package。在這種情況下,您的插件將需要包含在傳遞給refreshPackages的數組中。
  • 另一種選擇是在插件清單中使用DynamicImport-Package語句。動態導入可在類加載期間解決

另一個選項是對捆綁對象使用Bundle.loadClass(而不是Class.forName)用於新安裝的捆綁軟件。這使用了新的bundle的類加載器,所以你的插件本身不需要依賴新的bundle。

+0

這聽起來像是正確的做法(+1) – 2011-01-28 16:13:51

1

我最近做這一個插件到Eclipse:

這裏是突出的代碼

URL[] urls = new URL[]{ new URL("jar", "", "file:" + jarFile.getAbsolutePath() + "!/")}; 
URLClassLoader cl = URLClassLoader.newInstance(urls, this.getClass().getClassLoader()); 
Class<?> loadedClass = cl.loadClass("com.whatever.SomeClass"); 
相關問題