module-info hygiene

Ioi Lam ioi.lam at oracle.com
Tue Oct 18 18:20:24 UTC 2016



On 10/17/16 12:43 PM, Robert Scholte wrote:
> On Mon, 17 Oct 2016 12:59:25 +0200, Alan Bateman 
> <Alan.Bateman at oracle.com> wrote:
>
>> On 17/10/2016 08:32, Peter Levart wrote:
>>
>>> :
>>>
>>> Do we need an --exclude-modules (in addition to --add-modules) 
>>> option on javac, java and jlink commands?
>>>
>>> --exclude-modules would be different to --limit-modules. If some 
>>> module requires module M and there is no module M on the module path 
>>> or it is not observable because it was not mentioned in the 
>>> --limit-modules option, then an exception is raised. OTOH if some 
>>> module X requires module M and module M is mentioned in the 
>>> --exclude-modules option, then such requires is silently ignored in 
>>> hope that module X will not actually need types from module M.
>> The module declaration is intended to be authoritative and so we have 
>> to trust module author when they declare that the module `requires 
>> M`. So my view is that options such as --exclude-modules that would 
>> have the effect of dropping requires puts us on the road to anarchy.
>>
>> That said, I do see Robert's concern that there might be orphaned 
>> `requires` clauses in some modules.  My module started using the 
>> preferences API but later the implementation changed to use something 
>> else. I neglected to remove the `requires java.prefs` from the module 
>> declaration and the result is that my module cannot compile against 
>> or run on a run-time image that doesn't include this module. Static 
>> analysis tools might help here, as might the IDE. We are used to IDEs 
>> highlighting unused `import` statements and in time then I expect 
>> they will do the same for apparently unused `requires` clauses in 
>> module-info.java. If the usage is purely reflective then the module 
>> author might need to put a comment on the `requires` clause to avoid 
>> other maintainers from removing it (a bit like "// used by javadoc" 
>> in comments today when an import is for an unqualified reference in 
>> the javadoc).
>>
>> Another part to Robert's mail is the case where something is making 
>> use of types in modules that it doesn't depend on. Assuming these are 
>> static references then they will be caught at compile-time. This is 
>> big improvement compared to today's class path.
>>
>> A more general comment is that module authors will need to learn a 
>> few new things about compatibility and refactoring. One example is 
>> changing `requires transitive M` to `requires M` is an incompatible 
>> change.  Another is splitting a module (several sub-cases) where the 
>> module author will need to add `requires transitive` to avoid 
>> breaking consumers. There are lots of opportunities here for 
>> authoritative books and documentation to help module authors do this 
>> right.
>>
>> -Alan
>>
>>
>
> I understand why *in concept* the --exclude-modules is an unwanted 
> option. The module-info clearly states "requires A.B", otherwise it 
> should have been marked as "optional" or simply removed.
> Now that the user fully relies on the discipline of the 
> library-builders: users cannot control the modules, nor will the 
> compilation fail in case of an incorrect module-info.
> It is really a matter of hoping that library-builders are aware of 
> this and maybe it will make libraries more popular based on the 
> quality of the module-info instead of the quality of the classes. As a 
> user you probably don't want to be forced to choose on these facts.
> And for the smaller and medium application this will work, but for the 
> larger this can really become problematic.
>
> Up until now the compiler was always about "is everything on the 
> classpath to compile the classes?". If there is more, we'll, it'll be 
> ignored. "More" was never a problem. And if it was a problem, the user 
> could fix it.
>
> Now we have the module-info, and it is actually a safety-belt for the 
> library-builder! Now he can never be blamed (almost): the module-info 
> contains at least all info to compile and run this library, maybe even 
> more for free.
> But with a lot of libraries with their own safety-belts there can be 
> (and will be) conflicts and there's nothing you can do right now 
> (apart from dropping all safety-belts).
> For the end-user all these small safety-belts doesn't feel very 
> "safe". He would feel much better if he had some of the control back 
> (and yes, he's very well aware of the possible consequences).
>
> The introduction of the module-info comes with great powers, but that 
> comes with great responsibilities as well. I would like to see that 
> the compiler could help with controlling those required modules (which 
> would mean that "More" is considered to be a problem). Static analysis 
> is IMHO just a hint, ignorable, but to me it shouldn't be that way.
>

Maybe a "javac -Xlint:unusedmodules" can give warnings that hopefully 
most library developers will notice?

Or, for some reason if the library uses module X only via reflection, 
perhaps there can be a way to turn off the warning for just module X?

Another option is to have a static analysis tool (similar to jdep) that 
can print out all the dependencies and give various warnings/suggestions 
regarding minimizing the "requires" clauses?



More information about the jigsaw-dev mailing list