Are you building with maven?
(if not why are you here)

On 6 July 2010 17:32, Per-Erik Svensson <[email protected]> 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?
>
> 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]
> >
> >
>

Reply via email to