[ https://issues.apache.org/jira/browse/FELIX-532?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12587572#action_12587572 ]
Stuart McCulloch commented on FELIX-532: ---------------------------------------- OK, here's the change from the clarifications section of the second edition of the JavaTM Virtual Machine Specification... http://java.sun.com/docs/books/jvms/second_edition/html/ChangesAppendix.doc.html " * Clarifying that the class hierarchy is searched when resolving fields and methods. The original specification was unclear as to whether, during method or field resolution, the referenced field had to be declared in the exact class referenced or could be inherited. This led to variations among Java virtual machine implementations and inconsistency between The Java Virtual Machine Specification and The JavaTM Language Specification. The revised specification gives a more precise description that agrees with the behavior of most implementations, but not with The JavaTM Language Specification. The JavaTM Language Specification will be corrected in its next edition. This choice gives programmers the flexibility of moving methods and fields in the class hierarchy while retaining binary compatibility with previous implementations of their programs. " Which is why with target > 1.2 the method invocation uses a reference to the sub-class (because the hierarchy will be searched) while with target = 1.1 the method invocation uses the abstract base class (because the original JVM spec didn't say that the hierarchy would be searched). And as they say in the clarification, the reason why the hierarchy should be searched is because developers can then move methods around in the various superclasses without breaking binary compatibility. So from my perspective it looks as though Bnd is working correctly - if you use the 1.1 bytecode it has this additional reference to the "support" package, so it's correct that Bnd should add this as an import because you may need it when running in an older JVM, whereas with the 1.2 bytecode you won't need this import because the newer JVMs (>1.1) will traverse the hierarchy transparently. All of which leads to the question - does this cause an actual error when you deploy to an OSGi framework? Or are you seeing the error elsewhere, such as Eclipse/PDE, which has a number of known bugs relating to visibility of abstract base classes (PDE/JDT thinks it needs an import but the OSGi spec actually says the import is not needed). > Package inheritance dependencies are not imported when maven-compiler-plugin > is defined in build > ------------------------------------------------------------------------------------------------ > > Key: FELIX-532 > URL: https://issues.apache.org/jira/browse/FELIX-532 > Project: Felix > Issue Type: Bug > Components: Maven Bundle Plugin > Affects Versions: maven-bundle-plugin-1.4.0 > Environment: JDK 1.5.0_14 on Windows XP > Reporter: James Rowe > Assignee: Stuart McCulloch > Priority: Minor > Attachments: package-inheritance-test.zip > > > When maven-compiler-plugin is explicitly added to the build, inheritance > dependencies are not resolved. For example, the attached test case uses > org.springframework.jdbc.core.JdbcTemplate, which extends > org.springframework.jdbc.support.JdbcAccessor (note the superclass lives in a > different package). The method we invoke is defined on JdbcAccessor, hence > the inheritance dependency. When the compiler plugin is included in the > build, the bundle plugin fails to import the inherited > org.springframework.jdbc.support package dependency. When the compiler > plugin is taken out of the build, the bundle plugin correctly imports it. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.