I saw something similar when developing using Equinox so this might not actually be an issue with Felix. Swing can be given a single classloader to use to reach into the bundles to instantiate Look and Feel related classes with reflection. You can only specify one classloader so you need to provide one that is capable of loading everything that Swing needs. So even though your bundle does not need to import Look and Feel implementation classes it has to be able to load them on Swing's behalf. This UI delegate stuff is tricky and Swing sometimes swallows exceptions which makes it hard to understand what is going on.
Duncan On Thu, Jul 7, 2011 at 7:51 AM, Stuart McCulloch <[email protected]> wrote: > On 7 Jul 2011, at 14:42, Richard S. Hall wrote: > >> On 7/7/11 5:39, Elvy wrote: >>> this is a kind of follow-up to >>> http://old.nabble.com/Look-And-Feel-tt16896587.html this thread ... >>> >>> The following situation happened when I switched from maven-bundle-plugin >>> 1.4.0 to 2.3.4. >> >> Are you saying that if you go back to 1.4.0 then it starts to work? If so, >> can't you compare the two manifests to see what's different between the two >> and see if you can make the second like the first? > > also check what's actually in the bundle (ie. use "unzip -l" or "jar tvf" on > it) because 2.3.4 sees the complete transitive dependency list whereas 1.4.0 > didn't, so you could be embedding more now: > > > http://felix.apache.org/site/apache-felix-bundle-plugin-faq.html#ApacheFelixBundlePluginFAQ-WhydoIseemoreclassesinmybundleafterupgradingtomavenbundleplugin2.0.0%253F > >> -> richard >> >>> >>> I'm using the http://www.jidesoft.com Jide Product and they have a jar >>> with their Synthetica UI delegates. As far as packages are concerned, this >>> jar contains these two: >>> - com.jidesoft.plat.synthetica >>> - javax.swing.plat.synth >>> >>> >>> Those familiar with Synthetica noticed that the package >>> "javax.swing.plat.synth" is already part of the JDK (in rt.jar). There is >>> only one class in their package. They say that until JDK7 they need to do >>> this because they need access to certain methods not yet visible. >>> >>> I added this jar to my pom.xml dependencies (runtime scope) and when I >>> started felix (v3.0.8), I got a NoClassDefFound on the class >>> SynthLookAndFeel. >>> >>> >>> java.lang.reflect.InvocationTargetException >>> at java.awt.EventQueue.invokeAndWait(EventQueue.java:1042) >>> at >>> javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1326) >>> {...} >>> Caused by: java.lang.NoClassDefFoundError: >>> javax/swing/plaf/synth/SynthLookAndFeel >>> at com.jidesoft.plaf.basic.BasicJideButtonUI.updateMargin(Unknown >>> Source) >>> at com.jidesoft.plaf.basic.BasicJideButtonUI.installDefaults(Unknown >>> Source) >>> at com.jidesoft.plaf.basic.BasicJideButtonUI.installUI(Unknown >>> Source) >>> at javax.swing.JComponent.setUI(JComponent.java:662) >>> at com.jidesoft.swing.JideButton.updateUI(Unknown Source) >>> at >>> com.jidesoft.plaf.basic.BasicCommandBarTitleBarUI$a_.updateUI(Unknown >>> Source) >>> at javax.swing.AbstractButton.init(AbstractButton.java:2149) >>> at javax.swing.JButton.<init>(JButton.java:118) >>> at javax.swing.JButton.<init>(JButton.java:73) >>> at com.jidesoft.swing.JideButton.<init>(Unknown Source) >>> at com.jidesoft.swing.JideButton.<init>(Unknown Source) >>> at >>> com.jidesoft.plaf.basic.BasicCommandBarTitleBarUI$a_.<init>(Unknown Source) >>> at >>> com.jidesoft.plaf.basic.BasicCommandBarTitleBarUI.installComponents(Unknown >>> Source) >>> at >>> com.jidesoft.plaf.basic.BasicCommandBarTitleBarUI.installUI(Unknown Source) >>> at javax.swing.JComponent.setUI(JComponent.java:662) >>> at javax.swing.JMenuBar.setUI(JMenuBar.java:118) >>> at com.jidesoft.action.CommandBarTitleBar.setUI(Unknown Source) >>> at com.jidesoft.action.CommandBarTitleBar.updateUI(Unknown Source) >>> at javax.swing.JMenuBar.<init>(JMenuBar.java:95) >>> at com.jidesoft.action.CommandBarTitleBar.<init>(Unknown Source) >>> at >>> com.jidesoft.plaf.basic.BasicCommandBarUI.installComponents(Unknown Source) >>> at com.jidesoft.plaf.basic.BasicCommandBarUI.installUI(Unknown >>> Source) >>> at javax.swing.JComponent.setUI(JComponent.java:662) >>> at com.jidesoft.action.CommandBar.updateUI(Unknown Source) >>> at javax.swing.JMenuBar.<init>(JMenuBar.java:95) >>> at com.jidesoft.action.DockableBar.<init>(Unknown Source) >>> at com.jidesoft.action.CommandBar.<init>(Unknown Source) >>> at com.jidesoft.action.CommandBar.<init>(Unknown Source) >>> at com.jidesoft.action.CommandMenuBar.<init>(Unknown Source) >>> {...} >>> Caused by: java.lang.ClassNotFoundException: >>> javax.swing.plaf.synth.SynthLookAndFeel not found by myBundle [13] >>> at >>> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:787) >>> at >>> org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:71) >>> at >>> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1768) >>> at java.lang.ClassLoader.loadClass(ClassLoader.java:247) >>> ... 51 more >>> >>> >>> >>> For my felix to start, I now need to set the boot delegation (in >>> config.properties) as: >>> org.osgi.framework.bootdelegation=javax.swing.plaf.*,sun.*,com.sun.* >>> >>> >>> Here's my maven-bundle-plugin configuration (if relevent): >>> >>> <plugin> >>> <groupId>org.apache.felix</groupId> >>> <artifactId>maven-bundle-plugin</artifactId> >>> <extensions>true</extensions> >>> <configuration> >>> <instructions> >>> <Bundle-Name>...</Bundle-Name> >>> <Bundle-Version>${project.version}</Bundle-Version> >>> <Private-Package>mypackage.osgi</Private-Package> >>> <_exportcontents> >>> com.jidesoft.*, >>> net.miginfocom.*, >>> org.apache.commons.logging.*, >>> org.apache.poi.* >>> </_exportcontents> >>> <Import-Package>*;resolution:=optional</Import-Package> >>> >>> <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency> >>> <Embed-Transitive>true</Embed-Transitive> >>> >>> <Service-Component>OSGI-INF/service-component.xml</Service-Component> >>> <Include-Resource>{maven-resources}</Include-Resource> >>> <Bundle-NativeCode> ...</Bundle-NativeCode> >>> >>> <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> >>> <Implementation-Vendor>...</Implementation-Vendor> >>> <Implementation-Version>${project.version}</Implementation-Version> >>> </instructions> >>> </configuration> >>> </plugin> >>> >>> >>> >>> I don't fully understand neither the problem nor the solution. Shouldn't >>> class loaders "communicate" until the desired class is found? >>> >>> Is this the correct solution? >>> >>> Just so you know, in the bundle activator, I set the Swing classloader to my >>> OSGi classloader with UIManager.put("ClassLoader", >>> bundleContext.getClass().getClassLoader()); >>> >>> >>> Regards >>> >>> ----- >>> Tell me something you don't know! >> >> --------------------------------------------------------------------- >> 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]

