2012-03-14 46 views
1

以下情況類加載衝突:有兩個Eclipse插件

在工作中我們有一個自己的插件,擴展一些JDT的功能,並建立了一些輔助功能,爲我們自己的框架。到現在爲止還挺好。

該插件包含以下類:

public class MoxLogFactory extends org.apache.commons.logging.LogFactory { 
    ... 
} 

(我離開了具體的實現,因爲它是真正綜合)

現在我加入的WindowBuilder-插件我Eclipse安裝。我可以使用包含的嚮導創建新的項目和類。但主要特點 - 編輯自己 - 不起作用。它出來了,WindowBuilder試圖從我們的插件中加載類「MoxLogFactory」!我連着,如果我打開編輯器,出現的堆棧跟蹤:

java.lang.ClassNotFoundException: org.dreamox.moxanos.log.MoxLogFactory 
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501) 
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) 
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) 
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at org.apache.commons.logging.LogFactory.createFactory(LogFactory.java:1261) 
at org.apache.commons.logging.LogFactory$2.run(LogFactory.java:1065) 
at java.security.AccessController.doPrivileged(Native Method) 
at org.apache.commons.logging.LogFactory.newFactory(LogFactory.java:1062) 
at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:497) 
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:704) 
at org.apache.commons.digester.Digester.<init>(Digester.java:340) 
at org.eclipse.wb.internal.core.model.description.helpers.ComponentDescriptionHelper.getDescription0(ComponentDescriptionHelper.java:375) 
at org.eclipse.wb.internal.core.model.description.helpers.ComponentDescriptionHelper.getDescription0(ComponentDescriptionHelper.java:289) 
at org.eclipse.wb.internal.core.model.description.helpers.ComponentDescriptionHelper.getDescription(ComponentDescriptionHelper.java:258) 
at org.eclipse.wb.internal.core.model.JavaInfoUtils.createJavaInfo(JavaInfoUtils.java:386) 
at org.eclipse.wb.internal.rcp.parser.ParseFactory.getRootContext(ParseFactory.java:184) 
at org.eclipse.wb.internal.core.parser.JavaInfoParser.prepareParseContext(JavaInfoParser.java:1185) 
at org.eclipse.wb.internal.core.parser.JavaInfoParser.parse(JavaInfoParser.java:244) 
at org.eclipse.wb.internal.core.parser.JavaInfoParser.access$9(JavaInfoParser.java:240) 
at org.eclipse.wb.internal.core.parser.JavaInfoParser$1.runObject(JavaInfoParser.java:153) 
at org.eclipse.wb.internal.core.parser.JavaInfoParser$1.runObject(JavaInfoParser.java:1) 
at org.eclipse.wb.internal.core.utils.execution.ExecutionUtils.runDesignTime(ExecutionUtils.java:153) 
at org.eclipse.wb.internal.core.parser.JavaInfoParser.parse(JavaInfoParser.java:151) 
at org.eclipse.wb.internal.core.editor.DesignPage.internal_refreshGEF(DesignPage.java:522) 
at org.eclipse.wb.internal.core.editor.DesignPage.access$9(DesignPage.java:510) 
at org.eclipse.wb.internal.core.editor.DesignPage$8$1.run(DesignPage.java:437) 
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:180) 
at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150) 
at org.eclipse.swt.widgets.Display.syncExec(Display.java:4683) 
at org.eclipse.wb.internal.core.editor.DesignPage$8.run(DesignPage.java:434) 
at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:464) 
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372) 
at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507) 
at org.eclipse.wb.internal.core.editor.DesignPage.internal_refreshGEF_withProgress(DesignPage.java:453) 
at org.eclipse.wb.internal.core.editor.DesignPage.internal_refreshGEF(DesignPage.java:403) 
at org.eclipse.wb.internal.core.editor.UndoManager.refreshDesignerEditor(UndoManager.java:381) 
at org.eclipse.wb.internal.core.editor.UndoManager.activate(UndoManager.java:90) 
at org.eclipse.wb.internal.core.editor.DesignPage.handleActiveState_True(DesignPage.java:251) 
at org.eclipse.wb.internal.core.editor.DesignPage.handleActiveState(DesignPage.java:229) 
at org.eclipse.wb.internal.core.editor.multi.DefaultMultiMode.showPage(DefaultMultiMode.java:125) 
at org.eclipse.wb.internal.core.editor.multi.DefaultMultiMode$1.widgetSelected(DefaultMultiMode.java:63) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) 
at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2746) 
at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1433) 
at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) 
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:999) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:893) 
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:85) 
at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:579) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:534) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:352) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:624) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:579) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1433) 
at org.eclipse.equinox.launcher.Main.main(Main.java:1409) 

我們的插件不出口任何東西,所以爲什麼是的WindowBuilder試圖從它加載一個類?它從哪裏得到信息來加載這個類?如果我卸載我們的插件WindowBuilder工作正常,但我需要兩個插件來有效地工作。

我發現,在MoxLogFactory在一個靜態方法有一行

System.setProperty("org.apache.commons.logging.LogFactory","org.dreamox.moxanos.log.MoxLogFactory"); 

我想每一個插件在沙箱中運行,因此這是不是一個真正的問題,但是當我看到堆棧跟蹤,看來,這個系統屬性是「全食日蝕」。 MoxLogFactory類也在我們的應用服務器框架中使用,因此需要此代碼 - 插件使用框架本身來工作。

我不知道如何解決這個問題,並會欣賞任何提示或想法。

回答

2

這裏有一些選擇:

  • 刪除JVM級別系統屬性的靜態初始化和需要

  • 在你的靜態初始化只有當一個命令行選項,測試的Eclipse執行更換上下文請求類加載器爲org.eclipse.equinox.launcher.Main類,如果是,請不要設置logfactory屬性

+0

感謝您的想法。命令行不太適合,但第二個聽起來很有趣。 我試着用一個簡單的檢查從運行的類路徑,但它幾乎是相同的想法! Thx! – dataj1998 2012-03-21 22:53:23

0

系統屬性屬於JVM,不屬於類加載器。通過將記錄器設置爲系統屬性,大概是爲了能夠自動加載它,您已經告訴整個系統使用它。當另一個插件加載並嘗試初始化它的日誌記錄時(它似乎也使用Apache Commons日誌記錄),它會讀取System屬性,嘗試加載其中找到的類,並且因爲無法看到您的插件而立即失敗。

+0

我明白了。並且沒有任何可能性來「發佈」我的日誌記錄類。好友類加載不適合,因爲我必須操縱WindowBuilder,這不是我想要的。 – dataj1998 2012-03-21 22:33:18