You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Peter Kriens (JIRA)" <ji...@apache.org> on 2012/05/29 20:46:22 UTC
[jira] [Comment Edited] (FELIX-3407) Imports are missed for
generics
[ https://issues.apache.org/jira/browse/FELIX-3407?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13285004#comment-13285004 ]
Peter Kriens edited comment on FELIX-3407 at 5/29/12 6:45 PM:
--------------------------------------------------------------
It turns out that I had commented out a section due to a not understanding of the JVM spec class file format caused this.
That said, it took a long time to work out since the example is rather convoluted since it contains Blueprint and hard to parse names. The following minimal example showed the problem:
bundle a: class a.A implements B<C> { }
bundle b: public interface b.B<T> { }
bundle c: public class c.C {}
It really helps if the problems are brought back to their absolute minimum since I can then create a test case without too much effort.
Anyway, this is in the next branch and will be released in about 3 weeks.
was (Author: pkriens):
It turns out that I had commented out a section due to a not understanding of the JVM spec class file format caused this.
That said, it took a long time to work out since the example is rather convoluted since it contains Blueprint and hard to parse names. The following minimal example showed the problem:
a: class A implements B<C> { }
b: public interface B<T> { }
c: public class C {}
It really helps if the problems are brought back to their absolute minimum since I can then create a test case without too much effort.
Anyway, this is in the next branch and will be released in about 3 weeks.
> 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: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira