You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by Tim Moloney <t....@verizon.net> on 2008/07/14 04:55:18 UTC

How do I avoid ClassCastExceptions with a split package?

I'm trying to get cometd working with Felix.  I believe that I have it 
mostly working but I'm getting a ClassCastException on cometd requests, 
specifically "can not cast 
org.mortbay.jetty.nio.SelectChannelConnector$RetryContinuation to 
org.mortbay.util.ajax.Continuation" (this is from memory so it may be a 
bit off).  I think that this is a classloader issue since the 
RetryContinuation class implements the Continuation interface.  I know 
that split packages can cause ClassCastExceptions due to different 
classloaders but I'm not sure this is the problem.

I'm using the following bundles:
- org.apache.felix:org.apache.felix.http.jetty:0.9.0-SNAPSHOT (modified 
to use jetty 6.1.11)
- org.mortbay.jetty:jetty:6.1.11
- org.mortbay.jetty:jetty-util:6.1.11
- org.mortbay.jetty:servlet-api-2.5:6.1.11
- a custom comet bundle that
  - inlines org.mortbay.jetty:cometd-api:0.9.20080221and 
org.mortbay.jetty:cometd-bayeux:6.1.11
  - maps org.mortbay.cometd.continuation.ContinuationCometdServlet to 
/cometd

jetty-util exports org.mortbay.util but cometd-bayeux has 
org.mortbay.util.ArrayQueue.  I managed to get my custom comet bundle to 
compile by making org.mortbay.util a private package.  However, this 
duplicates all of org.mortbay.util in my bundle which I think is causing 
the ClassCastException.

What is the best way to handle the split package and avoid 
ClassCastExceptions?

Tim


Re: How do I avoid ClassCastExceptions with a split package?

Posted by Peter Kriens <pe...@aqute.biz>.
The cometd support looks very interesting but it does not work for me. I want to start using your bundle but I get the same class cast exception. I also do not understand how it could work since the HTTP bundle does not export the org.mortbay classes but the cometd must use them?

I also do not understand how your sample bundle works, where does it gets the dojo.js from?

Would be great if this works though! Kind regards,

	Peter Kriens



On 15 jul. 2008, at 04:53, Tim Moloney wrote:

> Tim Moloney wrote:
>> Tim Moloney wrote:
>>> 
>>> I'm trying to get cometd working with Felix.  I believe that I have it mostly working but I'm getting a ClassCastException on cometd requests, specifically "can not cast org.mortbay.jetty.nio.SelectChannelConnector$RetryContinuation to org.mortbay.util.ajax.Continuation" (this is from memory so it may be a bit off).  I think that this is a classloader issue since the RetryContinuation class implements the Continuation interface.  I know that split packages can cause ClassCastExceptions due to different classloaders but I'm not sure this is the problem.
>>> 
>>> I'm using the following bundles:
>>> - org.apache.felix:org.apache.felix.http.jetty:0.9.0-SNAPSHOT (modified to use jetty 6.1.11)
>>> - org.mortbay.jetty:jetty:6.1.11
>>> - org.mortbay.jetty:jetty-util:6.1.11
>>> - org.mortbay.jetty:servlet-api-2.5:6.1.11
>>> - a custom comet bundle that
>>> - inlines org.mortbay.jetty:cometd-api:0.9.20080221and org.mortbay.jetty:cometd-bayeux:6.1.11
>>> - maps org.mortbay.cometd.continuation.ContinuationCometdServlet to /cometd
>>> 
>>> jetty-util exports org.mortbay.util but cometd-bayeux has org.mortbay.util.ArrayQueue.  I managed to get my custom comet bundle to compile by making org.mortbay.util a private package.  However, this duplicates all of org.mortbay.util in my bundle which I think is causing the ClassCastException.
>>> 
>>> What is the best way to handle the split package and avoid ClassCastExceptions?
>>> 
>>> Tim
>>> 
>> 
>> I found the split-package command in the bnd documentation.  I tried both merge-first and merge-last but I still got the ClassCastExceptions.  I think this is because the org.mortbay.util package was still being duplicated in my bundle.  I then tried first which only copied org.mortbay.util.ArrayQueue into my bundle but then the rest of org.mortbay.util couldn't be found.  I finally tried using the following but I'm still getting the original ClassCastExceptions.
>> 
>> <Private-Package>org.mortbay.util;-split-package:=first</Private-Package>
>> <Import-Package>!org.mortbay.log,!org.mortbay.thread,!org.mortbay.util.ajax,*</Import-Package> 
>> <Require-Bundle>org.mortbay.jetty.util</Require-Bundle>
>> 
>> I'm out of ideas.  Does anyone have any suggestions?
>> 
>> Tim
>> 
> 
> I managed to get things working by adding ArrayQueue to the jetty-util bundle and modifying how http.jetty is packaged.
> 
> For http.jetty, I simply changed the Private-Package instruction as shown below.  Can someone review the change and commit it, if it doesn't break anything?
> 
> Tomorrow, I'll investigate if I really needed to move ArrayQueue to the jetty-util bundle.
> 
> Index: pom.xml
> ===================================================================
> --- pom.xml     (revision 676451)
> +++ pom.xml     (working copy)
> @@ -97,7 +97,7 @@
>                        </Export-Package>
>                        <Private-Package>
>                            org.apache.felix.http.jetty,
> -                            org.mortbay.*;-split-package:=merge-first
> +                            org.mortbay.jetty.*;-split-package:=merge-first
>                        </Private-Package>
>                        <Import-Package>
>                            javax.net.ssl; javax.security.cert;
> 
> 
> Tim
> 


Re: How do I avoid ClassCastExceptions with a split package?

Posted by Tim Moloney <t....@verizon.net>.
Tim Moloney wrote:
> Tim Moloney wrote:
>>
>> I'm trying to get cometd working with Felix.  I believe that I have 
>> it mostly working but I'm getting a ClassCastException on cometd 
>> requests, specifically "can not cast 
>> org.mortbay.jetty.nio.SelectChannelConnector$RetryContinuation to 
>> org.mortbay.util.ajax.Continuation" (this is from memory so it may be 
>> a bit off).  I think that this is a classloader issue since the 
>> RetryContinuation class implements the Continuation interface.  I 
>> know that split packages can cause ClassCastExceptions due to 
>> different classloaders but I'm not sure this is the problem.
>>
>> I'm using the following bundles:
>> - org.apache.felix:org.apache.felix.http.jetty:0.9.0-SNAPSHOT 
>> (modified to use jetty 6.1.11)
>> - org.mortbay.jetty:jetty:6.1.11
>> - org.mortbay.jetty:jetty-util:6.1.11
>> - org.mortbay.jetty:servlet-api-2.5:6.1.11
>> - a custom comet bundle that
>>  - inlines org.mortbay.jetty:cometd-api:0.9.20080221and 
>> org.mortbay.jetty:cometd-bayeux:6.1.11
>>  - maps org.mortbay.cometd.continuation.ContinuationCometdServlet to 
>> /cometd
>>
>> jetty-util exports org.mortbay.util but cometd-bayeux has 
>> org.mortbay.util.ArrayQueue.  I managed to get my custom comet bundle 
>> to compile by making org.mortbay.util a private package.  However, 
>> this duplicates all of org.mortbay.util in my bundle which I think is 
>> causing the ClassCastException.
>>
>> What is the best way to handle the split package and avoid 
>> ClassCastExceptions?
>>
>> Tim
>>
>
> I found the split-package command in the bnd documentation.  I tried 
> both merge-first and merge-last but I still got the 
> ClassCastExceptions.  I think this is because the org.mortbay.util 
> package was still being duplicated in my bundle.  I then tried first 
> which only copied org.mortbay.util.ArrayQueue into my bundle but then 
> the rest of org.mortbay.util couldn't be found.  I finally tried using 
> the following but I'm still getting the original ClassCastExceptions.
>
> <Private-Package>org.mortbay.util;-split-package:=first</Private-Package>
> <Import-Package>!org.mortbay.log,!org.mortbay.thread,!org.mortbay.util.ajax,*</Import-Package> 
>
> <Require-Bundle>org.mortbay.jetty.util</Require-Bundle>
>
> I'm out of ideas.  Does anyone have any suggestions?
>
> Tim
>

I managed to get things working by adding ArrayQueue to the jetty-util 
bundle and modifying how http.jetty is packaged.

For http.jetty, I simply changed the Private-Package instruction as 
shown below.  Can someone review the change and commit it, if it doesn't 
break anything?

Tomorrow, I'll investigate if I really needed to move ArrayQueue to the 
jetty-util bundle.

Index: pom.xml
===================================================================
--- pom.xml     (revision 676451)
+++ pom.xml     (working copy)
@@ -97,7 +97,7 @@
                         </Export-Package>
                         <Private-Package>
                             org.apache.felix.http.jetty,
-                            org.mortbay.*;-split-package:=merge-first
+                            
org.mortbay.jetty.*;-split-package:=merge-first
                         </Private-Package>
                         <Import-Package>
                             javax.net.ssl; javax.security.cert;


Tim


Re: How do I avoid ClassCastExceptions with a split package?

Posted by Tim Moloney <t....@verizon.net>.
Tim Moloney wrote:
>
> I'm trying to get cometd working with Felix.  I believe that I have it 
> mostly working but I'm getting a ClassCastException on cometd 
> requests, specifically "can not cast 
> org.mortbay.jetty.nio.SelectChannelConnector$RetryContinuation to 
> org.mortbay.util.ajax.Continuation" (this is from memory so it may be 
> a bit off).  I think that this is a classloader issue since the 
> RetryContinuation class implements the Continuation interface.  I know 
> that split packages can cause ClassCastExceptions due to different 
> classloaders but I'm not sure this is the problem.
>
> I'm using the following bundles:
> - org.apache.felix:org.apache.felix.http.jetty:0.9.0-SNAPSHOT 
> (modified to use jetty 6.1.11)
> - org.mortbay.jetty:jetty:6.1.11
> - org.mortbay.jetty:jetty-util:6.1.11
> - org.mortbay.jetty:servlet-api-2.5:6.1.11
> - a custom comet bundle that
>  - inlines org.mortbay.jetty:cometd-api:0.9.20080221and 
> org.mortbay.jetty:cometd-bayeux:6.1.11
>  - maps org.mortbay.cometd.continuation.ContinuationCometdServlet to 
> /cometd
>
> jetty-util exports org.mortbay.util but cometd-bayeux has 
> org.mortbay.util.ArrayQueue.  I managed to get my custom comet bundle 
> to compile by making org.mortbay.util a private package.  However, 
> this duplicates all of org.mortbay.util in my bundle which I think is 
> causing the ClassCastException.
>
> What is the best way to handle the split package and avoid 
> ClassCastExceptions?
>
> Tim
>

I found the split-package command in the bnd documentation.  I tried 
both merge-first and merge-last but I still got the 
ClassCastExceptions.  I think this is because the org.mortbay.util 
package was still being duplicated in my bundle.  I then tried first 
which only copied org.mortbay.util.ArrayQueue into my bundle but then 
the rest of org.mortbay.util couldn't be found.  I finally tried using 
the following but I'm still getting the original ClassCastExceptions.

<Private-Package>org.mortbay.util;-split-package:=first</Private-Package>
<Import-Package>!org.mortbay.log,!org.mortbay.thread,!org.mortbay.util.ajax,*</Import-Package> 

<Require-Bundle>org.mortbay.jetty.util</Require-Bundle>

I'm out of ideas.  Does anyone have any suggestions?

Tim