Compile time vs. runtime deps was: Requires optional permits

David Holmes david.holmes at oracle.com
Wed Jul 11 01:33:41 PDT 2012


On 11/07/2012 5:22 PM, Jaroslav Tulach wrote:
> Dne St 11. července 2012 08:59:20, Paul Sandoz napsal(a):
>> On Jul 11, 2012, at 8:28 AM, David Holmes wrote:
>>>> If there is an optional dependency then presumably code in the depending
>>>> module must be using types exported by the optional dependent module.
>>>> Reflection is one way to use those types, another is a little bit of
>>>> indirection (static or via reflection) to static usage of those types.>
>>> I think this is wrong. I can use the optional module reflectively so that
>>> there is no direct type dependency (else the dependency would not be
>>> optional!).
>> Yes, but the dependency can also be direct at compile time and optional at
>> install time, it's just that "requires optional" does not differentiate
>> between the two cases.
>>> There is no reason that it needs to be present at compile time if I don't
>>> use those types directly. I would think the above statement from the Big
>>> Picture should read:
>>>
>>> "A foo module must still be available when compiling bar _if_ code in bar
>>> depends upon types declared in foo."
>> That's seems reasonable to me. I will try and get some clarification on
>> this.
>>
>> Perhaps the resolver should output warnings at compile time for optional
>> modules that are not present to augment any "cannot find symbol" compiler
>> errors?
>
> I believe both cases are possible. I can have optional dependency I need to
> compile against and I can as well have another optional dependency I don't
> need to compile against.
>
> There needs to be a way to express that properly to Jigsaw runtime as well as
> Javac.

I don't see why I need to make the distinction to the compiler. I 
declare an optional dependency and at compile-time it is, or isn't 
found. During compilation I reference a type and a module for that type 
is, or isn't, found. Whether the module was omitted or was optional it 
is simply a compile-time error if the type is not found. (I don't expect 
javac to know or determine that the not-found type would have been found 
in the missing optional module - how could it?)

Conversely if I don't reference a type that isn't found, it is 
irrelevant whether there exists an optional module that wasn't found.

David
-----

>
> This is another example when runtime and compile time dependencies may
> differ. The first one I know is the list of annotation processor providing
> modules to be present when compiling, but not during execution.
>
> Time to introduce "requires compile m at 1.0"?
> -jt
>



More information about the jigsaw-dev mailing list