[ 
https://issues.apache.org/jira/browse/FELIX-3003?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Torsten updated FELIX-3003:
---------------------------

    Attachment: felix-3003-resolverimpl-sysout-NPE.txt
                felix-3003-bundle123-headers.txt
                felix-3003-bundle103-headers.txt

I've got ride of the NPE and found out that it was caused by a wrong export 
statement (exporting a version that didn't exists) in one of my bundles. I am 
not sure why this problem has never occured before and why it only occurs on 
first start of Karaf. Further startups doesn't show the NPE at all! I'll guess 
OSGi is more dynamic then I thought.. ;-)

Here are the involved bundles:
Bundle 103: activemq-core-5.5.0
Bundle 122: custom-api
Bundle 123: custom-osgified-libs (with lots of im/exports)

1) First, I've figured out which requirement caused the NPE through patching 
felix-framework.jar with sysout statements in ResolverImpl.permutateIfNeeded:
        System.out.println("Needed Req: " + req);
        Iterator<Requirement> iter = candidateMap.keySet().iterator();
        while (iter.hasNext()) {
                        Requirement requirement = (Requirement) iter.next();
                        Set<Capability> capabilities = 
candidateMap.get(requirement);
                        System.out.println( "Req: " + req + " --> " + 
(capabilities!=null?capabilities.toString():"null") );
                }
                
2) It seems that just before the NPE "org.apache.commons.logging" was needed 
but only 1 other packages was in the candidateMap:

    Needed Req: [103.0] package; (package=org.apache.commons.logging)
    Req: [103.0] package; (package=org.apache.commons.logging) --> [[123.0] 
package; package=org.geotools.geometry.jts]
    13:34:13,546 | WARN  | tenerContainer-2 | AbstractMessageListenerContainer  
694 | b120 | Execution of JMS message listener failed, and no ErrorHandler has 
been set.
    java.lang.NullPointerException
        at 
org.apache.felix.framework.resolver.ResolverImpl.permutateIfNeeded(ResolverImpl.java:1164)
        
3) Then, I wondered why the "org.geotools.geometry.jts" package is the only 
candidate. This package is exported by bundle 123 ("lib"). Also, this package 
uses "com.vividsolutions.jts.geom", which in turn is used, embedded and 
exported by bundle 122 ("API"). Bundle 122 contains the domain objects that 
bundle 103 ("amq") tries to deserialize (imported through DynamicImport *). 
This was misleading, tough (at least for my problem, maybe it is still 
interesting for you).

4) It turns out, the problem was related to the "org.apache.commons.logging" 
package that was exported by bundle 123 ("lib") with a wrong version:
karaf> packages:exports |grep "commons.logging"
     4 org.apache.commons.logging; version=1.1.1
     4 org.apache.commons.logging; version=1.0.4
     4 org.apache.commons.logging.impl; version=1.1.1
     4 org.apache.commons.logging.impl; version=1.0.4
   116 org.apache.commons.logging; version=1.1.1
   116 org.apache.commons.logging.impl; version=1.1.1
   123 org.apache.commons.logging; version=1.7.0
   123 org.apache.commons.logging.impl; version=1.7.0

5) Bundle 103 ("amq"), which caused the NPE, imported this package statically 
without version through Import-Package as well as with DynamicImport-Package * 
(see attached file).
6) Maybe the DynamicImport picked the highest version available, but the 
framework couldn't deliver, because, well, this version isn't even 
implemented.. ;-) 
7) The reason for the commons-logging version export 1.7.0 was due to an 
misconfigured maven-bundle-plugin, which included the commons-logging export 
statement due to transitive dependencies. I actually only wanted to export 
commons-beanutils:
    <Export-Package>
        
org.apache.commons.*;version=${commons.beanutils.version};-split-package:=merge-first,
        
So, yeah I guess this issue is resolved for me. I am not sure if this is enough 
information for you guys to fix the NPE in the framework. If you need any more 
infos or output of karaf commands, let me know.

> NPE in ResolverImpl.permutateIfNeeded
> -------------------------------------
>
>                 Key: FELIX-3003
>                 URL: https://issues.apache.org/jira/browse/FELIX-3003
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-3.0.9
>         Environment: karaf 2.2.1, activemq 5.5.0
>            Reporter: Torsten
>         Attachments: felix-3003-bundle103-headers.txt, 
> felix-3003-bundle123-headers.txt, felix-3003-resolverimpl-sysout-NPE.txt
>
>
> After upgrade to Karaf 2.2.1, I noticed the following NPE in the Felix 
> framework code:
> 14:31:54,306 | WARN  | tenerContainer-1 | AbstractMessageListenerContainer  
> 694 | b120 | Execution of JMS message listener failed, and no ErrorHandler 
> has been set.
> java.lang.NullPointerException
>       at 
> org.apache.felix.framework.resolver.ResolverImpl.permutateIfNeeded(ResolverImpl.java:1156)
>       at 
> org.apache.felix.framework.resolver.ResolverImpl.checkPackageSpaceConsistency(ResolverImpl.java:1085)
>       at 
> org.apache.felix.framework.resolver.ResolverImpl.resolve(ResolverImpl.java:171)
>       at 
> org.apache.felix.framework.Felix$FelixResolver.resolve(Felix.java:4103)
>       at 
> org.apache.felix.framework.ModuleImpl.searchDynamicImports(ModuleImpl.java:1412)
>       at 
> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:734)
>       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:248)[:1.6.0_20]
>       at java.lang.Class.forName0(Native Method)[:1.6.0_20]
>       at java.lang.Class.forName(Class.java:247)[:1.6.0_20]
>       at 
> org.apache.activemq.util.ClassLoadingAwareObjectInputStream.load(ClassLoadingAwareObjectInputStream.java:63)
>       at 
> org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:37)
>       at 
> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)[:1.6.0_20]
>       at java.util.ArrayList.readObject(ArrayList.java:593)[:1.6.0_20]
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method)[:1.6.0_20]
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)[:1.6.0_20]
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_20]
>       at java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_20]
>       at 
> java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)[:1.6.0_20]
>       at 
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)[:1.6.0_20]
>       at 
> org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:184)[103:org.apache.activemq.activemq-core:5.5.0]
>       at 
> org.springframework.jms.support.converter.SimpleMessageConverter.extractSerializableFromMessage(SimpleMessageConverter.java:215)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.support.converter.SimpleMessageConverter.fromMessage(SimpleMessageConverter.java:103)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.adapter.MessageListenerAdapter.extractMessage(MessageListenerAdapter.java:407)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:345)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:535)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:495)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)[120:org.springframework.jms:3.0.5.RELEASE]
>       at 
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)[120:org.springframework.jms:3.0.5.RELEASE]
>       at java.lang.Thread.run(Thread.java:619)[:1.6.0_20]
> I guess there is nothing I can do except downgrading to karaf 2.2.0? Any 
> other ideas?

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to