Ralph,

Apologies. I did not link to Jipsy as a suggestion to be used as a dependency 
but rather as an example of how the ModiTect plugin may be applied to a project 
that produces and tests an APT. 

I believe Jipsy has a 2nd Maven module that produces a “test” jar without it 
being an actual test jar, that is, with the -tests classifier. This is the 
approach mentioned by Robert. 

ModiTect helps you keep a codebase compatible with Java 8 while also supporting 
JPMS with full module descriptors added to the final jar as an MRJAR. 

Hope this helps. 

Cheers
Andres

Sent from my primitive tricorder

> On 22 Jun 2021, at 22:42, Ralph Goers <ralph.go...@dslextreme.com> wrote:
> 
> Andres,
> 
> I looked at moditect when I first started doing the work. I’m afraid I am not 
> understanding how 
> it could help solve the problem with the test jar and unit tests. Could you 
> please explain that?
> 
> I am also not sure I understand how Jipsy will help. Log4j generates the file 
> in META-INF/services 
> when it generates the service class. It does not add the provides statement 
> to module-info.java. 
> Perhaps if it also did that it would bypass the compiler error saying the 
> service can’t be found. 
> 
> That is certainly worth looking into.
> 
> Ralph
> 
> 
> 
>> On Jun 22, 2021, at 12:41 AM, Andres Almiray <aalmi...@gmail.com> wrote:
>> 
>> Have you tried using the ModiTect Maven plugin?
>> 
>> <goog_1688275269>
>> https://github.com/moditect/moditect
>> 
>> There are many ways to use it:
>> - with explicit module-info.java
>> - with an embedded DSL in the pom.xml
>> - with an embedded module descriptor in the pom.xml
>> 
>> Ii use the last option on Jipsy [https://github.com/kordamp/jipsy/], which
>> happens to define an APT as well.
>> 
>> https://github.com/kordamp/jipsy/blob/master/jipsy-processor/pom.xml
>> 
>> Cheers,
>> Andres
>> 
>> -------------------------------------------
>> Java Champion; Groovy Enthusiast
>> http://andresalmiray.com
>> http://www.linkedin.com/in/aalmiray
>> --
>> What goes up, must come down. Ask any system administrator.
>> There are 10 types of people in the world: Those who understand binary, and
>> those who don't.
>> To understand recursion, we must first understand recursion.
>> 
>> 
>>> On Tue, Jun 22, 2021 at 7:02 AM Ralph Goers <ralph.go...@dslextreme.com>
>>> wrote:
>>> 
>>> Sorry for posting again. I really need to proof-read better. Please ignore
>>> the prior email.
>>> 
>>> I have recently had quite an adventure modifying several of Log4j’s Maven
>>> modules to
>>> implement JPMS on our master branch. It was an adventure due to a few
>>> issues:
>>> 
>>> 1. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8265826 <
>>> https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8265826>.
>>>  This bug has been fixed in Java 17 but Log4j uses Java 11 to build.
>>> 2. Log4j-plugins builds an annotation processor, packages it with the
>>> annotations
>>>  and classes necessary to build and run plugins, creates and test jar
>>> and runs unit tests.
>>> 3. It is not possible to compile an annotation processor with a
>>> module-info.java present.
>>>  The compile will fail because it can’t find the annotation processor
>>> “service” when
>>>  compiling module-info.java.
>>> 4. It is very difficult to compile an annotation processor and then use it
>>> in the same Maven
>>>  module. JPMS expects the annotation processor to either be on the
>>> classpath or specified
>>>  with the processorpath option. When a module-info.java is present,
>>> Maven automatically
>>>  moves everything to the module path. Maven only supports using
>>> coordinates to specify the
>>>  processor path, which don’t exist when the processor is in the same
>>> module. The only way
>>>  to solve this is to compile all the classes with proc=only without a
>>> module-info.java present.
>>> 5. Although number 4 might seem bad, it really doesn’t matter because
>>> javac will fail if a
>>>  module-info.java is present because module-info.java will have a
>>> reference to the service
>>>  class being generated by the annotation processor and for some reason
>>> module-info.java
>>>  is resolved before the annotation processor runs.
>>> 6. If the main set of classes are compiled with a module-info.java every
>>> other compile
>>>  in the Maven module must also be modularized. Likewise, if the main
>>> module does
>>>  not contain a module-info.java no other compile can either.
>>> 7. JPMS requires that every module have its own package space with no
>>> overlap
>>>   with any other JPMS module.
>>> 
>>> So while generating the log4j-plugins module is quite painful, generating
>>> log4j-core isn’t
>>> much better. That is actually the primary focus for this list.
>>> 
>>> Log4j-core consists of the main classes packaged in the jar, a test jar
>>> that is used by
>>> downstream Maven modules, and the unit tests. Prior to JPMS one would just
>>> create
>>> the main jar and then package all the test classes and unit tests in a
>>> test jar. This can
>>> no longer be done with JPMS.
>>> 
>>> When a project publishes a test jar along with the main jar, just like any
>>> other JPMS
>>> module. the test jar cannot use the package space of the main classes.
>>> Log4j core
>>> uses org.apache.logging.log4j.core so I placed all the test utility
>>> classes under
>>> org.apache.logging.log4j.core.test. However, the unit tests all need to be
>>> packaged
>>> in the main package space since its module-info.java “extends” the main
>>> module and
>>> several unit tests are required to be in the same main package so that
>>> they can access
>>> package private methods specifically provided for testing.
>>> 
>>> In order to get this to work I had to perform the following steps:
>>> 
>>>       • Compile all the main classes except module-info.java with the
>>> Plugin annotation processor.
>>>       • Compile the main module-info.java.
>>>       • Compile the test classes used by other modules with
>>> module-info.java and
>>>         using the plugin preprocessor.
>>>       • Package these test classes in a test jar.
>>>       • Delete the module-info and generated source for the test classes.
>>>       • Move the main module-info to a temp location.
>>>       • Compile the unit test classes without module-info.java.
>>>       • Move the main module-info back to the classes directory.
>>>       • Compile module-info.java for unit tests.
>>>       • Run the unit tests.
>>>       • Create the main jar if the unit tests pass.
>>> 
>>> Were it not for JDK-8265826 I believe this could have been simplified
>>> somewhat to:
>>> 
>>>       • Compile all the main classes except module-info.java with the
>>> Plugin annotation processor.
>>>       • Compile the main module-info.java.
>>>       • Compile the test classes used by other modules with its
>>> module-info.java and
>>>        using the plugin preprocessor.
>>>       • Package these test classes in a test jar.
>>>       • Delete the module-info and generated source for the test classes.
>>>       • Compile the unit test classes with its module-info.java.
>>>       • Compile module-info.java for unit tests.
>>>       • Run the unit tests.
>>>       • Create the main jar if the unit tests pass.
>>> 
>>> So the gist of this entire email is pretty simple. Is there a way Maven
>>> could be modified
>>> to better support creating test jars with JPMS?
>>> 
>>> Ralph
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
> For additional commands, e-mail: dev-h...@maven.apache.org
> 

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

Reply via email to