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?

-> 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]

Reply via email to