Joel,

Great post! Will try it over the weekend since I'm swamped in with other
work at the moment. Thanks for the information!

Regards,
Per-Erik


On Tue, Jul 6, 2010 at 7:02 PM, Joel Schuster <[email protected]> wrote:

> My blog post on getting substance look and feel working under OSGi using a
> classloader work around:
>
>
> http://joelschuster.blogspot.com/2010/07/real-examples-osgi-classloader.html
>
> - Joel
>
> -----Original Message-----
> From: Richard S. Hall [mailto:[email protected]]
> Sent: Tuesday, July 06, 2010 6:58 AM
> To: [email protected]
> Subject: Re: Class loading, swingx and Felix
>
> On 7/6/10 3:32, Per-Erik Svensson wrote:
> > Setting the bootdelegation did work! I can see however that this might
> not
> > be a great solution seen as it might break modularization. However, are
> > there any other problems that I'm not thinking of, besides that all
> bundles
> > in the system now will be forced to use the exact same swingx and
> substance
> > version?
> >
>
> Specifying packages for boot delegation also does not require your
> bundles to import those packages, so their dependencies will be hidden.
> At a minimum, make sure any bundles with dependencies continue to import
> those packages and the system bundle continues to export them. Then look
> into the blog Joel is going to create to try to fix the issue in a
> better way.
>
> -> richard
>
> > Thanks alot for the help, to both of you! (And sorry for the late
> response,
> > I've been home sick.)
> >
> > Regards,
> > P-E
> >
> > On Thu, Jul 1, 2010 at 4:13 PM, Richard S. Hall<[email protected]
> >wrote:
> >
> >
> >> On 7/1/10 9:44, Joel Schuster wrote:
> >>
> >>
> >>> I always thought that it was bad form to use the bootdelegation
> framework
> >>> config.
> >>>
> >>>
> >>>
> >> Yes, it is.
> >>
> >> ->  richard
> >>
> >>
> >>   Anyhow... as an alternative you can use the classloader workaround
> >>
> >>> available through dynamicjava.org.
> >>>
> >>> Here's my blog post about how to use it.
> >>>
> >>> http://joelschuster.blogspot.com/2010/06/cheating-in-osgi.html
> >>>
> >>>
> >>> -----Original Message-----
> >>> From: Richard S. Hall [mailto:[email protected]]
> >>> Sent: Thursday, July 01, 2010 7:21 AM
> >>> To: [email protected]
> >>> Subject: Re: Class loading, swingx and Felix
> >>>
> >>> 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]
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: [email protected]
> >>> For additional commands, e-mail: [email protected]
> >>>
> >>>
> >>>
> >>>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [email protected]
> >> For additional commands, e-mail: [email protected]
> >>
> >>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to