You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Stuart McCulloch (JIRA)" <ji...@apache.org> on 2013/04/02 01:47:15 UTC

[jira] [Resolved] (FELIX-3407) Imports are missed for generics

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

Stuart McCulloch resolved FELIX-3407.
-------------------------------------

       Resolution: Fixed
    Fix Version/s: maven-bundle-plugin-2.4.0

2.4.0-SNAPSHOT now uses latest bndlib so this will be fixed in the upcoming bundleplugin release
                
> 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
>             Fix For: maven-bundle-plugin-2.4.0
>
>         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