------ | |
Older projects with module-info | |
------ | |
Robert Scholte | |
------ | |
2016-09-27 | |
------ | |
~~ Licensed to the Apache Software Foundation (ASF) under one | |
~~ or more contributor license agreements. See the NOTICE file | |
~~ distributed with this work for additional information | |
~~ regarding copyright ownership. The ASF licenses this file | |
~~ to you under the Apache License, Version 2.0 (the | |
~~ "License"); you may not use this file except in compliance | |
~~ with the License. You may obtain a copy of the License at | |
~~ | |
~~ http://www.apache.org/licenses/LICENSE-2.0 | |
~~ | |
~~ Unless required by applicable law or agreed to in writing, | |
~~ software distributed under the License is distributed on an | |
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
~~ KIND, either express or implied. See the License for the | |
~~ specific language governing permissions and limitations | |
~~ under the License. | |
~~ NOTE: For help with the syntax of this file, see: | |
~~ http://maven.apache.org/doxia/references/apt-format.html | |
Older projects with module-info | |
Projects that want to be compatible with older versions of Java (i.e 1.8 or below bytecode and API), but also want to provide a | |
<<<module-info.java>>> for use on Java 9+ runtime, must be aware that they need to call <<<javac>>> twice: | |
[[1]] the <<<module-info.java>>> must be compiled with <<<release=9>>>, | |
[[2]] while the rest of the sources must be compiled with the lower expected compatibility version of <<<source>>>/<<<target>>>. | |
[] | |
The preferred way to do this is by having 2 execution blocks, as described below: | |
[[1]] default <<<default-compile>>> execution with <<<release=9>>>, | |
[[2]] additional custom <<<base-compile>>> execution with expected target compatibility. | |
[] | |
Notice that, in addition, JDK 9 only supports compilations for Java 6 and above, so projects wanting to be compatible with Java 5 or below need | |
to use two different JDKs for the 2 executions. With {{{/guides/mini/guide-using-toolchains.html}toolchains}} configuration, it is | |
quite easy to achieve this, even if a little bit more complex. | |
* Java 6 to 8 Compatibility | |
In case you want the project to be Java 6, 7 or 8 compatible, you can simply use JDK 9 for both execution blocks. | |
The easiest way is to use Java 9 as the runtime for Maven, by setting <<<JAVA_HOME=/path/to/jdk-9>>> before running <<<mvn>>>. | |
But if you want to use an older Java runtime for Maven, you can use the maven-toolchain-plugin to specify the shared JDK (supported since Maven 2.0.9) | |
or a custom jdkToolchain (supported since Maven 3.3.1) and refer to the JDK 9 installation on your system. | |
+------- | |
<project> | |
[...] | |
<build> | |
[...] | |
<plugins> | |
<plugin> | |
<groupId>org.apache.maven.plugins</groupId> | |
<artifactId>maven-compiler-plugin</artifactId> | |
<version>${project.version}</version> | |
<executions> | |
<execution> | |
<id>default-compile</id> | |
<configuration> | |
<release>9</release> | |
<!-- no excludes: compile everything to ensure module-info contains right entries --> | |
</configuration> | |
</execution> | |
<execution> | |
<id>base-compile</id> | |
<goals> | |
<goal>compile</goal> | |
</goals> | |
<configuration> | |
<!-- recompile everything for target VM except the module-info.java --> | |
<excludes> | |
<exclude>module-info.java</exclude> | |
</excludes> | |
</configuration> | |
</execution> | |
</executions> | |
<!-- defaults for compile and testCompile --> | |
<configuration> | |
<release>6</release><!-- or 7 or 8 depending on compatibility expectations --> | |
<!-- Only required when Maven runtime JAVA_HOME isn't at least Java 9 and when haven't configured the maven-toolchains-plugin --> | |
<jdkToolchain> | |
<version>9</version> | |
</jdkToolchain> | |
</configuration> | |
</plugin> | |
</plugins> | |
[...] | |
</build> | |
[...] | |
</project> | |
+------- | |
* Java 5 or below Compatibility | |
Given Maven 3 requires newer Java release at runtime, you'll absolutely need to use Toolchains to use a JDK different from | |
Maven runtime. | |
Be aware that you will need at least Maven 3.3.1 to specify a custom jdkToolchain in your plugin configuration. | |
You could add a jdkToolchain to do base-compile execution-block as well referring to JDK 5. | |
+------- | |
<project> | |
[...] | |
<build> | |
[...] | |
<plugins> | |
<plugin> | |
<groupId>org.apache.maven.plugins</groupId> | |
<artifactId>maven-compiler-plugin</artifactId> | |
<version>${project.version}</version> | |
<executions> | |
<execution> | |
<id>default-compile</id> | |
<configuration> | |
<release>9</release> | |
<!-- no excludes: compile everything to ensure module-info contains right entries --> | |
<!-- toolchain required when JAVA_HOME is JDK 8 or below --> | |
<jdkToolchain> | |
<version>9</version> | |
</jdkToolchain> | |
</configuration> | |
</execution> | |
<execution> | |
<id>base-compile</id> | |
<goals> | |
<goal>compile</goal> | |
</goals> | |
<configuration> | |
<!-- recompile everything for target VM except the module-info.java --> | |
<excludes> | |
<exclude>module-info.java</exclude> | |
</excludes> | |
</configuration> | |
</execution> | |
</executions> | |
<!-- defaults for compile and testCompile --> | |
<configuration> | |
<source>1.5</source> | |
<target>1.5</target> | |
<!-- jdkToolchain required when JAVA_HOME is JDK 9 or above --> | |
<jdkToolchain> | |
<version>[1.5,9)</version> | |
</jdkToolchain> | |
</configuration> | |
</plugin> | |
</plugins> | |
[...] | |
</build> | |
[...] | |
</project> | |
+------- |