Would it not be better to provide an option for people who need to do this 
level of validation so that there might be an option such as

—validate-module-presence=B

instead to make it possible to get the validation, but not have to do this for 
common, simple developer builds, but it could be included during a release 
build?

Gregg

> On Jul 21, 2016, at 3:05 AM, Peter Levart <peter.lev...@gmail.com> wrote:
> 
> Hi,
> 
> A "middle-ground" solution could be for javac to have yet another option, for 
> example:
> 
>    --add-phantom-module=B
> 
> Since the compiler invoker explicitly named the module, javac can validate 
> the qualified exports of other modules against this name too. If both the 
> exporting module declaration and the javac option have miss-typed the name in 
> the same way, so be it...
> 
> Regards, Peter
> 
> 
> On 07/21/2016 01:40 AM, Paul Benedict wrote:
>> Thank you Alex. Sounds like good advice. I'll raise it over there. Thanks
>> for chatting with me about it.
>> 
>> Cheers,
>> Paul
>> 
>> On Wed, Jul 20, 2016 at 6:37 PM, Alex Buckley <alex.buck...@oracle.com>
>> wrote:
>> 
>>> Since A does not require B, you are quite right that the compiler doesn't
>>> need B to compile A per se. It's solely the qualified export to B that
>>> drives the compiler to demand B when compiling A's module declaration. (I
>>> believe that javac should be disinterested in B when compiling A's type
>>> declarations.)
>>> 
>>> By all means, raise an issue on jpms-spec-comments about how a qualified
>>> export induces a compile-time circularity, being sure to note that taking a
>>> more relaxed view means passing through garbage qualified exports.
>>> 
>>> Alex
>>> 
>>> On 7/20/2016 4:22 PM, Paul Benedict wrote:
>>> 
>>>> Alex, I must respectfully disagree with your analogy. We both agree that
>>>> it is good for the compiler to check an "import" statement. I imagine we
>>>> would also both agree that checking "requires" is good too. I would
>>>> argue what makes this good is because the developer has the intention of
>>>> locating and consuming a resource -- package or module, respectively.
>>>> Even with a wildcard import statement, I am explicitly asking to consume
>>>> the contents of a package (whatever the contents); so if the package
>>>> isn't there, my intention cannot be met.
>>>> 
>>>> However, in my scenario here, I have no need to consume. Module A is not
>>>> consuming anything from Module B. All I want to do is issue a directive
>>>> for Module B at runtime, if B is even available at runtime. So I don't
>>>> really think the analogy you gave me applies.
>>>> 
>>>> Now, I could write a stub project for B and install it somewhere, but
>>>> that is kind of silly, don't you think? Why make me go through these
>>>> hoops? The compiler isn't providing any value here with this check. The
>>>> compiler doesn't need B to be statically accessible to prove anything
>>>> about exporting a package, does it? If it does, can you let me know why
>>>> it needs this proof?
>>>> 
>>>> Cheers,
>>>> Paul
>>>> 
>>>> On Wed, Jul 20, 2016 at 6:00 PM, Alex Buckley <alex.buck...@oracle.com
>>>> <mailto:alex.buck...@oracle.com>> wrote:
>>>> 
>>>>     On 7/20/2016 3:07 PM, Paul Benedict wrote:
>>>> 
>>>>         Currently I am writing a module that another team will consume.
>>>>         Let's just
>>>>         call these modules A and B. Module A must export its packages to
>>>>         Module B
>>>>         and B alone.
>>>> 
>>>>         For reasons beyond my control, I do not have access to Module B.
>>>>         However, I
>>>>         don't need to consume any types from B or use B in anyway --
>>>>         just need to
>>>>         give package visibility to B. So the compiler is stopping me
>>>>         because it
>>>>         says "error: module not found". Yes, the compiler is right...
>>>>         but it's too
>>>>         right.
>>>> 
>>>>         What do you think of loosening the compiler restriction here? I
>>>>         don't see a
>>>>         reason why the export target must be known at this point.
>>>> 
>>>> 
>>>>     We start by supposing that compile-time checking is good. Think of
>>>>     how the compiler checks your 'import' declarations in ordinary .java
>>>>     files. Even if you do a wildcard import because you're not sure
>>>>     which types you'll use, you still have the compiler checking that
>>>>     the package exists. For qualified exports, we assume that if you're
>>>>     friendly enough with the owner of B to add a qualified export to B,
>>>>     then you're friendly enough to have a copy of B available. As such,
>>>>     if you write 'exports ... to V' (yes, V, not B), then we aim to
>>>>     check that V exists. It doesn't, so you'll get an error, and you'll
>>>>     smack yourself for typing V rather than B.
>>>> 
>>>>     A wrinkle in your scenario is that module B requires module A, so B
>>>>     must be compiled with A present. And, A must be compiled with B
>>>>     present, due to 'exports ... to B'. There's no circularity in the
>>>>     'requires' clauses, but there is effectively a circularity in the
>>>>     module declarations more broadly. A certain amount of incremental
>>>>     craftsmanship will be necessary to allow this pair of modules to
>>>> flower.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
> 

Reply via email to