Thanks for the quick response. I'll try the bootdelegation way. I could also
of course explain the code more and even post some code as it is but I
honestly do not know what parts that you might find interesting as I have
little knowledge about the workings of class loaders. :(

Regards,
Per-Erik Svensson

On Thu, Jul 1, 2010 at 3:21 PM, Richard S. Hall <[email protected]>wrote:

> Well, the simplest thing to do here is to add that package to the
> org.osgi.framework.bootdelegation framework configuration property. You will
> likely also need to set org.osgi.framework.bundle.parent=app to use the
> application class loader for boot delegation.
>
> Without more detailed knowledge of your application and the code involved,
> it is difficult to say if there is a better way to go about this. I do know
> that the look and feel stuff is known to be problematic.
>
> -> richard
>
>
> On 7/1/10 8:06, Per-Erik Svensson wrote:
>
>> Hello,
>>
>> I'm working in a project where we use felix/osgi to create a
>> "plugin-framework" for a client side application. It works very well but
>> we
>> sometimes run into class loading problems, especially when one of our
>> "plugin"-bundles use third part libraries that loads classes through
>> Class.forName().
>>
>> Short description of the system:
>> Our system consists of our main application (not loaded through osgi) that
>> "embeds" Felix and starts the system bundle. We then use FileInstall to
>> add
>> plugins (ie other bundles).
>>
>> Problem:
>> SwingX is one of the libraries that use Class.forName() and
>> Class.getClassLoader().loadClass(). It does this to support different lafs
>> (such as Substance) and the calls are in a class named LookAndFeelAddons.
>> Here, it asks the UIManager to get the UI-class for a certain
>> SwingX-component and then load the UI-class using either forName() or
>> getClassLoader().loadClass(). So, if a class in a plugin is using a SwingX
>> component, that bundle/plugin must have access to the UI-class. This
>> causes
>> problems. We have one plugin with a JPanel-class that uses the JXHeader
>> from
>> the SwingX library. When the component is created we get the following
>> ClassNotFoundException:
>>
>> java.lang.RuntimeException: java.lang.RuntimeException: Failed to load
>> class
>> org.jvnet.substance.swingx.SubstanceHeaderUI
>>         at
>>
>> consilium.publish.wizard.ProfilesPanel$EditProfileWorker.done(ProfilesPanel.java:473)
>>         at javax.swing.SwingWorker$5.run(SwingWorker.java:718)
>>         at
>>
>> javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:864)
>>         at
>> sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:95)
>>         at
>>
>> javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:874)
>>         at javax.swing.Timer.fireActionPerformed(Timer.java:271)
>>         at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
>>         at
>> java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
>>         at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
>>         at
>> consilium.tools.InputZookeeper.dispatchEvent(InputZookeeper.java:709)
>>         at
>>
>> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
>>         at
>>
>> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
>>         at
>>
>> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
>>         at java.awt.Dialog$1.run(Dialog.java:1051)
>>         at java.awt.Dialog$3.run(Dialog.java:1103)
>>         at java.security.AccessController.doPrivileged(Native Method)
>>         at java.awt.Dialog.show(Dialog.java:1101)
>>         at java.awt.Component.show(Component.java:1516)
>>         at java.awt.Component.setVisible(Component.java:1468)
>>         at java.awt.Window.setVisible(Window.java:841)
>>         at java.awt.Dialog.setVisible(Dialog.java:991)
>>         at consilium.gui.SizedDialog.setVisible(SizedDialog.java:136)
>>         at consilium.actions.MenuBuilder$16$1$1.run(MenuBuilder.java:490)
>>         at
>> java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
>>         at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
>>         at
>> consilium.tools.InputZookeeper.dispatchEvent(InputZookeeper.java:709)
>>         at
>>
>> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
>>         at
>>
>> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
>>         at
>>
>> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
>>         at
>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
>>         at
>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
>>         at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
>> Caused by: java.lang.RuntimeException: Failed to load class
>> org.jvnet.substance.swingx.SubstanceHeaderUI
>>         at
>>
>> org.jdesktop.swingx.plaf.LookAndFeelAddons.getUI(LookAndFeelAddons.java:319)
>>         at org.jdesktop.swingx.JXHeader.updateUI(JXHeader.java:181)
>>         at javax.swing.JPanel.<init>(JPanel.java:69)
>>         at javax.swing.JPanel.<init>(JPanel.java:92)
>>         at javax.swing.JPanel.<init>(JPanel.java:100)
>>         at org.jdesktop.swingx.JXPanel.<init>(JXPanel.java:110)
>>         at org.jdesktop.swingx.JXHeader.<init>(JXHeader.java:113)
>>         at
>>
>> se.conciliate.htmlprofileeditor.editor.HTMLProfileEditor.initComponents(HTMLProfileEditor.java:353)
>>         at
>>
>> se.conciliate.htmlprofileeditor.editor.HTMLProfileEditor.init(HTMLProfileEditor.java:98)
>>         at
>>
>> se.conciliate.htmlprofileeditor.editor.HTMLProfileEditor.<init>(HTMLProfileEditor.java:86)
>>         at
>>
>> se.conciliate.htmlprofileeditor.HTMLPublishProfileService.editProfile(HTMLPublishProfileService.java:124)
>>         at
>>
>> consilium.publish.wizard.ProfilesPanel$EditProfileWorker.done(ProfilesPanel.java:465)
>>         ... 31 more
>> Caused by: java.lang.ClassNotFoundException:
>> org.jvnet.substance.swingx.SubstanceHeaderUI
>>         at
>>
>> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:198)
>>         at
>>
>> org.apache.felix.framework.searchpolicy.R4SearchPolicy.findClass(R4SearchPolicy.java:45)
>>         at
>>
>> org.apache.felix.framework.searchpolicy.ContentClassLoader.loadClass(ContentClassLoader.java:118)
>>         at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>>         at
>>
>> org.jdesktop.swingx.plaf.LookAndFeelAddons.getUI(LookAndFeelAddons.java:316)
>>         ... 42 more
>> Caused by: java.lang.ClassNotFoundException:
>> org.jvnet.substance.swingx.SubstanceHeaderUI
>>         at
>>
>> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClassOrResource(R4SearchPolicyCore.java:486)
>>         at
>>
>> org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:185)
>>         ... 46 more
>>
>> As you can see, LookAndFeelAddons wraps the exception in a
>> RuntimeException.
>> But it is clear from the Caused by that it is indeed a
>> ClassNotFoundException and that the class that cannot be found is
>> org.jvnet.substance.swingx.SubstanceHeaderUI. This class is part of the
>> main
>> application and thus not loaded (exported) to the OSGi-framework. The
>> offending class is the UI-class for the SwingX component JXHeader under
>> the
>> Substance look and feel. Now, I'm no master at class loading and certainly
>> not at OSGi class loading. But as I understand it, the bundle/plugin gets
>> its own class loader. Is there any way to set things up so that the
>> bundle/plugin class loader can delegate the class loading to the main
>> applications class loader. I mean, since the main application has
>> org.jvnet.substance.swingx.SubstanceHeaderUI on its classpath it will be
>> able to load it (and is able to load it in all code that we use from the
>> main application).
>>
>> Hope I have explained the problem decently enough. I first thought about
>> exporting the package org.jvnet.substance.swingx from the system bundle
>> and
>> importing it from the plugin-bundle. But this is not desirable since the
>> plugin shouldn't be tied to our specific LAF (it shouldn't even have to
>> know
>> that we use Substance and it shouldn't have to know the internal workings
>> of
>> swingx-laf addons).
>>
>> Regards,
>> Per-Erik Svensson
>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to