Niclas Hedhman <[EMAIL PROTECTED]> wrote on 09/19/2005 12:33:41 PM: > On Tuesday 20 September 2005 00:07, Jeff McAffer wrote: > > There is Java visibility and there is the ability of A to actually > > directly reference C. Of course class C has to be available to load class > > A but that does not mean that bundle A's classloader has to be able to see > > class C. It just needs to know someone (e.g., bundle B) who can. So, any > > direct reference to C's classes from A should fail unless A explicitly > > states a dependency (Import-Package or Require-Bundle) that makes them > > visible. At build/compile time, this means that setting up the classpath > > for compilation is more complicated. > > Huh?? Example; > > public class A extends B > { > public A() > { > System.out.println( "Message: " + getMessage() ); > } > } > > public class B extends C > { > } > > public class C > { > protected String getMessage() > { > return "Hello"; > } > } > > Are you saying that it is a legal construct to have a Classloader for A that > does not have class C visible?? And yet, that the getMessage() is called
> properly? You are confusing the ability of a CLASS to see things in its inheritance chain and that of a BUNDLE's classloader to see these things. In your example, add the following class D to Bundle A. Remember, Bundle A does not import or require any part of C. public class D { Class foo() { return C.class; } } The point here is that your example bundle A should compile and run just fine without any dependencies on C. Howeover, for the compilation of A to actually succeed, class C must be available and visible on the classpath at compile time. The classic way of doing this is to add its jar (whatever) to the classpath. Happiness. Class D in bundle A however should fail to compile since Bundle A does not state that it depends on C. That is, C is not on A's classpath at runtime. Without additional technology, having C's JAR on the classpath while compiling A makes this impossible. Conclusion, the class loading and class visibility rules used by the compiler get more complex. The Eclipse JDT compiler has a number of capabilities in this area. That is what allows the Eclipse PDE to report errors to you immediately when you reference classes that are not going to be available to you at runtime. To make this work in something like Maven (or even our build technology) however requires the build tooling to generate compiler inputs that describe the filtering etc. To do that, requires a decent model of the components and how they are wired together. > > Also; > <quote> > So, any direct reference to C's classes from A should fail > </quote> > > Are you talking about inner classes in C, or is "A extends B extends C" some > form of "bundle" inheritance, or something?? See above. > > I will leave > > the religious arguments about Require-Bundle and Import-Package aside and > > note that both are part of the spec. > > Ok, even though the rumour is that it was introduced to ease migration within > Eclipse ;o) There are technical merits and drawbacks to both. Use the one that makes you happy. > > Are you suggesting that Maven should be unable to build bundles that use > > Require-Bundle? > > No. I thought I said that having a Maven dependency resulting in a > Require-Bundle entry in the manifest is not the right solution. ... > That would imply that the Maven plaugin has a mechanism to create the > Require-Bundle entry, but require some form of additional "enable". Here there is a mindset difference. To me Maven does not create the dependencies or entries, the developer does. The developer is the one who knows how and why they depend on something. She may express that in a MANIFEST.MF or in a .pom. That is just syntax. What is important is that Maven (or any other tool) cannot fully reverse engineer the dependencies from just the code. Maven cannot likely, for example, figure out the right version range to specify all on its own. What about all the other directives and alternatives allowed by OSGi? Similarly, Maven should not be expected to figure out if a dependency should be expressed using Import-Package or Require-Bundle. There could be a default mode but Maven should expect and fully support the default to be set either way and allow people to override that detail in a first class way. Jeff