| ------ |
| Setting the -source and -target of the Java Compiler |
| ------ |
| Edwin Punzalan |
| ------ |
| 2006-07-05 |
| ------ |
| |
| ~~ 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 |
| |
| Setting the <<<-source>>> and <<<-target>>> of the Java Compiler |
| |
| Sometimes when you may need to compile a certain project to a different |
| version than what you are currently using. The <<<javac>>> can accept |
| such command using <<<-source>>> and <<<-target>>>. The Compiler Plugin |
| can also be configured to provide these options during compilation. |
| |
| For example, if you want to use the Java 8 language features (<<<-source 1.8>>>) |
| and also want the compiled classes to be compatible with JVM 1.8 (<<<-target 1.8>>>), |
| you can either add the two following properties, which are the default property names for the plugin parameters: |
| |
| +----- |
| <project> |
| [...] |
| <properties> |
| <maven.compiler.source>1.8</maven.compiler.source> |
| <maven.compiler.target>1.8</maven.compiler.target> |
| </properties> |
| [...] |
| </project> |
| +----- |
| |
| or configure the plugin directly: |
| |
| +----- |
| <project> |
| [...] |
| <build> |
| [...] |
| <plugins> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-compiler-plugin</artifactId> |
| <version>${project.version}</version> |
| <configuration> |
| <source>1.8</source> |
| <target>1.8</target> |
| </configuration> |
| </plugin> |
| </plugins> |
| [...] |
| </build> |
| [...] |
| </project> |
| +----- |
| |
| <<Note:>> Merely setting the <<<target>>> option does not guarantee that your code actually runs on a JRE with the |
| specified version. The pitfall is unintended usage of APIs that only exist in later JREs which would make your code |
| fail at runtime with a linkage error. To avoid this issue, you can either configure the compiler's boot classpath |
| to match the target JRE, or use the |
| {{{http://www.mojohaus.org/animal-sniffer/animal-sniffer-maven-plugin/}Animal Sniffer Maven Plugin}} |
| to verify your code doesn't use unintended APIs, or better yet use the |
| {{{../examples/set-compiler-release.html}<<<release>>> option supported since JDK 9}}. |
| In the same way, setting the <<<source>>> option does not guarantee that your code actually compiles on a JDK with |
| the specified version. To compile your code with a specific JDK version, different than the one used to launch Maven, |
| refer to the {{{../examples/compile-using-different-jdk.html}Compile Using A Different JDK}} example. |