Robert, I'm responding to dev@maven so we can discuss Maven philosophies...

I believe the pattern should be based on a multi-module project. Each
module should target the expected JDK version. Then introduce a new "mrjar"
type for the parent that knows how to bind them all together into a
Multi-Release JAR.

Cheers,
Paul

On Wed, Aug 31, 2016 at 6:10 AM, Robert Scholte <[email protected]>
wrote:

> I've been working on the implementation of this in the
> maven-compiler-plugin, but I'm not really pleased with the result.
> The problem is that in the worst case scenario we have to work with 3
> different versions of Java:
> - The Maven Runtime (set as JAVA_HOME)
> - JDK for the module-info.java
> - JDK for all other source files.
>
> The example below worked because all three were set to JDK9.
> But based on the source/target of 1.6 I cannot predict which JDK is used,
> only that it is at least JDK6. Should the plugin switch to another JDK?
> And if you want to compile with source/target 1.5 or less, you're in
> trouble. There's something called toolchain, where you can specify the
> JavaHome per version, but in case of maven-compiler-plugin it assumes that
> all java-related plugins and execution blocks want to use the same
> toolchain through the whole Maven project.
> The good news is that for the maven-jdeps-plugin I improved this part in
> Maven 3.3.1, since this plugin only works with Java8 and above, which
> doesn't have to be the same JDK to compile the sources with. Now you can
> simple say: I want the toolchain for version X. This feature needs to be
> added to the plugin.
>
> That said I think I will write a recipe for this. This is first of all an
> issue for library writers who want to have their jar compatible with
> multiple Java versions for their end users.
> Result: One javac call per execution block as it was meant to be.
>
> thanks,
> Robert
>
> On Fri, 26 Aug 2016 15:31:07 +0200, Oliver Gondža <[email protected]>
> wrote:
>
> Thank you all for your suggestions. I managed to get the project to build
>> with following maven setup:
>>
>> ```
>>    <!--
>>          When using compiler from java 8 and older, ignore module files
>> altogether.
>>          Otherwise, use 2 phase compilation to build
>>            - all classes for target version and
>>            - module-info.java with 9+ source and target level
>>       -->
>>    <build>
>>      <plugins>
>>        <plugin>
>>          <groupId>org.apache.maven.plugins</groupId>
>>          <artifactId>maven-compiler-plugin</artifactId>
>>          <version>3.5.1</version>
>>          <configuration>
>>            <source>1.6</source>
>>            <target>1.6</target>
>>          </configuration>
>>          <executions>
>>            <execution>
>>              <id>default-compile</id>
>>              <configuration>
>>                <excludes>
>>                  <exclude>**/module-info.java</exclude>
>>                </excludes>
>>              </configuration>
>>            </execution>
>>          </executions>
>>        </plugin>
>>      </plugins>
>>    </build>
>>
>>    <profiles>
>>      <profile>
>>        <id>jigsaw</id>
>>        <activation>
>>          <jdk>[1.9,)</jdk>
>>        </activation>
>>        <build>
>>          <plugins>
>>            <plugin>
>>              <groupId>org.apache.maven.plugins</groupId>
>>              <artifactId>maven-compiler-plugin</artifactId>
>>              <version>3.5.1</version>
>>              <configuration>
>>                <source>1.9</source>
>>                <target>1.9</target>
>>              </configuration>
>>              <executions>
>>                <execution>
>>                  <id>module-infos</id>
>>                  <phase>compile</phase>
>>                  <goals>
>>                    <goal>compile</goal>
>>                  </goals>
>>                  <configuration>
>>                    <includes>
>>                      <include>**/module-info.java</include>
>>                    </includes>
>>                  </configuration>
>>                </execution>
>>              </executions>
>>            </plugin>
>>          </plugins>
>>        </build>
>>      </profile>
>>    </profiles>
>> ```
>>
>> It does compile with older javac versions as a bonus. Given this is
>> nothing else than using `-source 9 -target 9` for module-info.java if
>> present, I dare to say maven-compiler-plugin can be adapted to figure this
>> out on its own.
>>
>

Reply via email to