I am trying to convert Log4j 2 to be fully modularized and am running into 
problems with Log4j-core.  First, I have hit a couple of nasty bugs when 
compiling 
on MacOS that are reflected in 
https://issues.apache.org/jira/browse/MCOMPILER-461 
<https://issues.apache.org/jira/browse/MCOMPILER-461> and 
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8265826 
<https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8265826>. 
Basically the compiler seems to be converting directory names that have a class 
with the same name in the same package to upper case. 

To combat this I am forced to compile without a module-info.java during 
annotation processing and again with the module-info.java.  

To make matters worse, the log4j-api, log4j-plugins, and log4j-core modules all 
have test classes that need to be made available to downstream modules for 
testing. Prior to JPMS we just passed the test jars on, but since many of the 
unit tests need to use the same packages as the main source the test modules to 
be 
passed on had to be placed into their own “test” package and so had to be moved 
out from the rest of the unit test classes so they could be package in a valid 
module.

As a result of this I had to convert my directory structure into
    src/main/java/ main classes
    src/main/java9/module-info.java
    src/test/java/ unit test classes & module-info.java
    src/test/java-test. Shared test classes
    src/test/java-test9/module-info.java 
                   
and my build consists of:
1. Running Log4j’s annotation processor against the main classes without 
module-info.java.
2. Compiling Log4j’s main classes with module-info.java.
3. Compiling the separate test classes with its module-info.java.
4. Packaging these test classes into the tests jar.
5. Running Log4j’s annotation processor against the unit test classes.
6. Compiling the unit tests.

But the build fails at step 5. If I do not include a module-info.java in the 
unit tests I get failures due to milling modules because maven is setting the 
module 
path (presumably because the main classes have one). If I do include the 
module-info.java then I run into the reported bugs and the compile fails with 
duplicate class errors. I’ve thought of trying to compile without 
module-info.java but I have to create a valid JPMS module for the separate test 
classes so that 
has to be done before starting on the unit tests.

The only way I can see to do this is to run the annotation processor without 
the module path but it seems the compiler plugin provides no option to do that.

My next thought is to try using 
https://github.com/bsorrentino/maven-annotation-plugin 
<https://github.com/bsorrentino/maven-annotation-plugin> to perform the 
annotation processing and see if I have better luck.

I should also add that these projects look like hell in Intellij as it has no 
idea how to resolve the second test directory.

Does anyone have any thoughts on how this could be more easily accomplished?  I 
can’t imagine I am the only person who needs to create a valid test jar.

Ralph

Reply via email to