It is kind of unfortunate that this topic has been hijacked for something I 
don't see as an issue.
I've been able to build up the right set of commandline arguments for this case 
for both javac and java

With *just* the dependencies(respecting compile + test scope) from the pom, and 
the module descriptor I've been able to compile the main/test sources and run 
the tests.

However, recently I've informed by this case: if the test sources use one of 
the java.* modules (that are not used by the main sources) the only correct way 
to solve it now is by adding the required flags by hand (and only to the 
test-compile configuration!).
This is hard to explain and instead of diving into the specifications, 
understanding what's happening, you'll see that they choose for the easy 
workaround: add this "test scoped" module as a required module to the module 
descriptor. 
In the end this will do more harm than good. A bit off-topic, but with Maven we 
already see that adding dependencies is simple, however cleaning up unused 
dependencies is not. Hence the exclude-option for dependencies is used 
frequently. Unlike Maven dependencies, you cannot exclude required modules, so 
here it is even more important that the list of required modules is the minimum 
required list.

To prevent these workarounds and to provide an easier way to patch a module via 
a dedicated descriptor will help keeping the module system cleaner.
I'm very pleased I've been able to hide most logic behind the required flags. 
This is a valid use case and in my opinion deserves a solution without explicit 
knowledge of these flags by the enduser (a tool like Maven should solve this, 
but this can only be done if it has access to this information.)
Introducing an extra modifier looks like one solution, maybe there is a better 
one.

thanks,
Robert

On 10-2-2020 23:03:28, Alex Buckley <alex.buck...@oracle.com> wrote:
Hi Christian,

On 2/7/2020 4:41 AM, Christian Stein wrote:
> This time, I created a project at [0] with a detailed description on its
> front page, i.e the README.md file.
>
> [0]: https://github.com/sormuras/java-module-patching

To restate:

- You're saying that, today, it's brittle to copy directives from
src/org.astro/main/java/module-info.java to
src/org.astro/test/java/module-info.java. (And having copied them, you
still need to `open` the test module and add some `requires`.)

- You suggest that, in future, there will still be a
src/org.astro/test/java/module-info.java file which is of interest to
test frameworks.

What you're hoping is that new syntax will let you invert the patching:

- Today, you set the module-path so that out/modules/test/org.astro.jar
is the "primary" version of the module; then you redefine everything in
it except module-info by overlaying out/modules/main/org.astro.jar.

- In future, you want to have out/modules/main/org.astro.jar as the
"primary" version, and redefine only its module-info by specifying the
sidecar out/modules/test/org.astro.jar. The sidecar would have some
syntax to identify that its declaration of org.astro is strictly
additive to the "primary" version. You would set the module-path to
out/modules/main:out/modules/test:lib so that the module system (1)
finds the "primary" version in out/modules/main and (2) augments its
module-info with sidecars found in out/modules/test and lib. I assume
some new command line option would enable or enumerate the sidecars
explicitly, because obviously the dependences and exports of
out/modules/main/org.astro.jar shouldn't depend on which JAR files
happen to be lurking deep in the module-path.

Stepping back, the core issue is that once the true "primary" version of
a module is built -- out/modules/main/org.astro.jar -- you don't want to
change it. No build or test tool wants to physically rewrite its
module-info to require test-time dependencies at test time, and then to
not require such dependencies at release time. You want the module
system to virtually rewrite the module-info instead. And that's already
possible, as long as you put on your test-colored sunglasses and view
out/modules/test/org.astro.jar as the "primary" version, and
out/modules/main/org.astro.jar as the overlay ... once the tests have
run, go back to viewing out/modules/main/org.astro.jar as the "primary"
version. Introducing a new kind of module descriptor, with merging by
the module system according to new command line options, seems like a
lot of overhead that can already be worked around by tools at test-time.

Alex

Reply via email to