Hi Will,

Yes I'm building with maven but fail to see where you're getting with that?
(maven-bundle-plugin which I believe is based on bnd. This does not help
with reflection-like class loading though.)

Regards,
Per-Erik

On Tue, Jul 6, 2010 at 10:37 AM, Will Budic <[email protected]> wrote:

> 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