On Wed, 09 Nov 2016 13:24:02 +0100, Matej Novotny <manov...@redhat.com> wrote:

Hello,

I was recently trying the following scenario with JDK 9 and mvn compiler 3.6.0: A new Maven project, with module-info, running with JDK 9, having a dependency on one other non-modular project (Weld SE in this case). Feel free to inspect it on GH -> https://github.com/manovotn/JDK9Playground

Now compiling this with debug mode showed me that Maven puts the dependency onto module-path of the project.
This means JDK 9 will turn this into automatic module.
So I ended up adding entries (`requires` formulas) into module-info.java on the one dependency I have there.

I managed to make it compile in the end, but I was wondering about the following: => Is there a way to tell Maven, that I want to add this dependency (and all it brings in transitively) to CLASSPATH instead of module path? - that would effectively mean there would be no automatic module (so I wouldn't need to declare it in module-info) and instead if would "fall back" to unnamed module (=searching classpath)

Right now there's no simple way to do that. While working on the modulepath I assumed that once people add the module-info, that they would also use auto modules by default to get a 100% pure module instead a hybrid. I've talked with the jigsaw team and there are still some issues with transitive (jigsaw) modules, which might effect the current implementation.

I think it is good to track this, so could you add a jira issue at https://issues.apache.org/jira/browse/MCOMPILER ?


=> Is there a way for Maven to automatically populate your module-info with entries regarding automatic modules? Or at least some kind of a detection for which ones do I need?

This is the ever returning question :) So in Java 9 jdeps is capable to generate a module-info template for you based on the code. It exports all packages, defines the requires and is often capable to detect which ones should be transitive, but is cannot detect the optionals. Be aware: this is a template, something to start with and which you MUST adjust. It is not an incremental tool.

Maven might create the "requires" part and know the optionals, but it cannot know about the transitivity (because it jigsaw transitive has a different definition than Maven transitive. They're still looking for a better keyword to prevent confusion, so any suggestion is welcome).

However, both Maven and the Jigsaw team need to come with a clear explanation, because dependencies and modules have different purposes. I'll give it a try: dependencies resolve into coordinates of multiple files which will be added to the classpath (and with Java9 it could also be the module path). Having too much dependencies is not an issue, it is simply another jar on the path. The "requires" of the module-info is there to enforce that certain files are available, either at compile time or at runtime. So you can compare this as 2 partly overlapping circles. For the larger part is could be possible, but especially the parts that don't overlap are hard (impossible?) to identify. It is very easy to add dependencies, but you never want any irrelevant "requires" inside your module-info.

I hope you understand that the purpose of dependencies and required modules are very different. Any attempt to try to solve this with magic is a potential failure. Any generated file must always be validated by the developer, there's no 1 to 1 translation.

Robert



Many thanks
Matej

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@maven.apache.org
For additional commands, e-mail: users-h...@maven.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@maven.apache.org
For additional commands, e-mail: users-h...@maven.apache.org

Reply via email to