Module-system requirements

Tim Ellison Tim_Ellison at uk.ibm.com
Mon Feb 16 17:21:23 UTC 2015


Tim Boudreau <niftiness at gmail.com> wrote on 16/02/2015 06:12:18:
> As I wrote in my reply to David, I think resources (in the traditional
> ClassLoader::getResource sense) should be treated as being strictly
> internal to modules.  If a module needs to make the information in one
> of its resources available to other modules then it should do so via a
> properly-exported class, or a service provider.  Just because JAR files
> are miniature filesystems which anybody can dissect doesn't mean that we
> need to conceive of Java modules in the same way.
> 
> There's a common case that I'd like to understand how you solve 
> without at least META-INF or its equivalent visible to other 
> modules:  It's fairly common to see applications that dynamically 
> compose things they find on the classpath.  Spring and a few other 
> things accomplish this through classpath-scanning, which is a fairly
> horrible pattern (you can wind up visiting every class on the 
> classpath, or a large subset, just to look for a runtime annotation 
> that is not there for the vast majority).
> 
> An alternative approach I've used many times, which I think a few 
> frameworks do as well (dagger?) is:  Write an annotation processor 
> that generates a flat file in META-INF that lists the classes that 
> have the annotation in question;  runtime code loads all such files 
> on the classpath and uses that to initialize things that should be 
> present at runtime.  It's really the same pattern as ServiceLoader.
> 
> Is it safe to assume that, whatever happens, that approach will 
> still work, whether by special-casing META-INF/** or some equivalent?
> 
> Having said that, I do agree that the module system must provide some
> kind of escape hatch or "promiscuous mode", as you call it, so here's
> a stab at an additional requirement for the "Modularizing Java SE"
> section:
> 
>   - _Overrideable encapsulation_ --- It must be possible to force a
>     module to export one or more of its packages to all other modules,
>     or to some specific modules, even if its definition does not do so.
> 
> One sort of low-hanging-fruit approach to this would be:
>  - Modules do not use the traditional $CLASSPATH
>  - The contents of $CLASSPATH are treated by the system as a single 
> module (so everything can see each other, and legacy code behaves 
asexpected)

Mark's new requirement would do it - though I had to swallow hard after 
reading the definition, as I heard all the safety-catches being clicked 
off.

I'm struggling to see how treating the contents of the classpath as a 
single module would help here?  The problem is with platform modules 
hiding previously accessible code.

Regards,
Tim

Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 
741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU


More information about the jpms-spec-observers mailing list