[ 
https://issues.apache.org/jira/browse/FELIX-3407?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13502487#comment-13502487
 ] 

Stuart McCulloch commented on FELIX-3407:
-----------------------------------------

Specifically: 
https://repository.apache.org/content/groups/snapshots/org/apache/felix/maven-bundle-plugin/2.4.0-SNAPSHOT/
                
> Imports are missed for generics
> -------------------------------
>
>                 Key: FELIX-3407
>                 URL: https://issues.apache.org/jira/browse/FELIX-3407
>             Project: Felix
>          Issue Type: Bug
>          Components: Maven Bundle Plugin
>    Affects Versions: maven-bundle-plugin-2.3.7
>            Reporter: Tomas Forsman
>         Attachments: example.zip
>
>
> The bundle plugin miss to add imports to classes/interfaces that are used in 
> generic blocks due to type erasure.
> Consider the following (the code is in the attached zip):
> bundle-a:
> package example.a.one;
> public interface ExampleInterfaceA<T extends ExampleInterfaceB> {
>     String getGreeting(T example);
> }
> package example.a.two;
> public interface ExampleInterfaceB {
> }
> bundle-b:
> package example.b.two;
> import example.a.two.ExampleInterfaceB;
> public interface ExampleImplementationB extends ExampleInterfaceB {
> }
> bundle-c:
> package example.c;
> import example.a.one.ExampleInterfaceA;
> import example.b.two.ExampleImplementationB;
> public interface ExampleExtendedInterfaceA extends 
> ExampleInterfaceA<ExampleImplementationB> {
> }
> package example.c;
> public class ExampleReferenceListener {
>     public void register(final ExampleExtendedInterfaceA example) {
>     }
>     public void unregister(final ExampleExtendedInterfaceA example) {
>     }
> }
> OSGI-INF/blueprint/services.xml
> <?xml version="1.0" encoding="UTF-8"?>
> <blueprint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>            xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
>            xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 
> http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd";>
>     <reference-list id="exampleReferenceListener"
>                     interface="example.c.ExampleExtendedInterfaceA"
>                     availability="optional">
>         <reference-listener bind-method="register" unbind-method="unregister">
>             <bean class="example.c.ExampleReferenceListener"/>
>         </reference-listener>
>     </reference-list>
> </blueprint>
> bundle-d:
> package example.d;
> import example.b.two.ExampleImplementationB;
> import example.c.ExampleExtendedInterfaceA;
> public class ExampleExtendedImplementation implements 
> ExampleExtendedInterfaceA {
>     public String getGreeting(final ExampleImplementationB example) {
>         return "Hello World";
>     }
> }
> OSGI-INF/blueprint/services.xml
> <?xml version="1.0" encoding="UTF-8"?>
> <blueprint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>            xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
>            xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 
> http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd";>
>     <bean id="exampleBean" class="example.d.ExampleExtendedImplementation"/>
>     <service id="exampleService" 
> interface="example.c.ExampleExtendedInterfaceA" ref="exampleBean"/>
> </blueprint>
> Since the bundle plugin uses byte-code to find out which imports to add to 
> the manifest, the bundle-c manifest look like this:
> Manifest-Version: 1.0
> Bnd-LastModified: 1332925553008
> Build-Jdk: 1.6.0_26
> Built-By: tofo01
> Bundle-ManifestVersion: 2
> Bundle-Name: example.bundle-c
> Bundle-SymbolicName: example.bundle-c
> Bundle-Version: 1.0.0.SNAPSHOT
> Created-By: Apache Maven Bundle Plugin
> Export-Package: example.c;uses:="example.a.one";version="1.0.0.SNAPSHOT"
> Import-Package: 
> example.a.one;version="[1.0,2)",org.osgi.service.blueprint;version="[1.0.0,2.0.0)"
> Import-Service: 
> example.c.ExampleExtendedInterfaceA;multiple:=true;availability:=optional
> Tool: Bnd-1.50.0
> The "example.a.two" package import is missing since type-erasure removes the 
> generic part of ExampleInterfaceA in the bundle-c interface.
> This results in a NoClassDefFondError of example.a.two.ExampleInterfaceB from 
> bundle-c when trying to deploy bundle-d.
> "Error tracking new service reference java.lang.NoClassDefFoundError: 
> example.a.two.ExampleInterfaceB not found by example.bundle-c [159]"

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to