> On Jun 18, 2021, at 2:19 PM, Jochen Wiedmann <jochen.wiedm...@gmail.com> 
> wrote:
> 
> On Fri, Jun 18, 2021 at 6:20 PM Ralph Goers <ralph.go...@dslextreme.com> 
> wrote:
> 
>> 2. The configuration does “strange things” because Maven doesn’t support 
>> creating a
>> JPMS module, JPMS test module, and running unit tests in a single Maven 
>> module
>> out of the box while also avoiding 
>> https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8265826.
>> The “strange configuration” makes that work. Log4j-Plugins is even more 
>> “strange”
>> because in addition to the above it also has to compile the annotation 
>> processor
>> without the module-info.java prior to doing the “build compile” so that the 
>> annotation
>> processor exists.
> 
> Are there existing Maven issues, that I could have a look at? Or, is
> the problem reproducible with a relatively simple example?

I haven’t created any Maven issues for this because Maven is working as 
designed, for the 
most part. I did create https://issues.apache.org/jira/browse/MCOMPILER-461 but 
that is 
for a different problem I encountered.

For the JPMS compiler bug I created 
https://github.com/rgoers/jpms-compile-fails. That 
bug was fixed in Java 17 so if we upgrade I could fix some of the 
“strangeness”. I have not 
tested with Java 17 to see if that also somehow fixes MCOMPILER-461.

But to create a sample project just use the standard Maven Archetype to create 
a project.
Then convert it to JPMS modules - you will need a module-info.java for both the 
main 
source and for the unit tests but the unit tests will “open” the main module 
and all the test 
classes will be in the same package space as the main source as is typical for 
normal testing.

Next create some classes that are used both in your unit tests and will be used 
in downstream 
tests. This is where it gets ugly. These tests have to be packaged in their own 
jar and cannot 
use the same package space as the main source, so typically you just would add 
.test to 
whatever the main source package is and put all these classes under that. You 
will find that 
you need to compile these separately from the other test classes and use a 
module-info.java 
that names the module properly. Once you have compiled these you would then 
package them 
as the test jar for the project. Once you do that you have to delete the 
module-info.class file that 
was generated and then compile the rest of the test classes with their 
module-info.java file.

As you can see, the complication is that JPMS doesn’t let you just package all 
your test crap in 
a jar and send it downstream for other modules to use as is typically done 
without it. If you do 
that you will get an error because it duplicates the main source modules 
packages.

Unfortunately, the test jar can’t be built in a separate module from the main 
source because 
it has dependencies on the main source and the test classes use the classes in 
the test jar.

So the problem really is that JPMS has made it so that any time you need to 
package a test 
jar you are going to have to do all this crap. Maven simply doesn’t have a 
convention to 
handle this. The fact that I also encountered a bug in the compiler just made 
things worse 
as that required that the module-info.java be compiled after all the classes 
were compiled.

https://github.com/apache/logging-log4j2/blob/master/log4j-core/README.md 
pretty much 
documents why I had to resort to all the messiness.

Ralph


Reply via email to