I just announced the new Spring 5 modules in REST With Spring:

>> CHECK OUT THE COURSE

2. Setting -source and -target of the Java Compiler

Let’s start with a hello world Maven project – where we’re using Java 7 on our local machine but we’d like to deploy the project to the production environment which is still using Java 6.

In this case, we can configure the Maven compiler plugin with source and target fields pointing to Java 6.

The “source” field is used for specifying compatibility with Java language changes and “target” field is used to for specifying compatibility with JVM changes.

Let’s now look at Maven compiler configuration of pom.xml:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
	<configuration>
            <source>1.6</source>
            <target>1.6</target>
	</configuration>
    </plugin>
</plugins>

With Java 7 on our local machine and Java code printing “hello world” to the console, if we go ahead and build this project using Maven, it will build and work correctly on a production box running Java 6.

public static void main(String[] args) { System.out.println("Hello World!"); System.out.println(StandardCharsets.UTF_8.name()); }

java.nio.charset.StandardCharsets was introduced in Java 7.

If we now go ahead and execute the Maven build, it will still compile successfully but fail at runtime with linkage error on a production box with Java 6 installed.

The Maven documentation mentions this pitfall and recommends to use Animal Sniffer plugin as one of the options.

<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>animal-sniffer-maven-plugin</artifactId> <version>1.16</version> <configuration> <signature> <groupId>org.codehaus.mojo.signature</groupId> <artifactId>java16</artifactId> <version>1.0</version> </signature> </configuration> <executions> <execution> <id>animal-sniffer</id> <phase>verify</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin>

Here, the configuration section of Animal Sniffer refers to an existing Java 6 runtime signature. Also, execution section checks and verifies the project source code against the given signature and flags if any issues are found.

If we go ahead and build the Maven project, the build will fail with the plugin reporting signature verification error as expected:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:animal-sniffer-maven-plugin:1.16:check 
(animal-sniffer) on project example-animal-sniffer-mvn-plugin: Signature errors found.
Verify them and ignore them with the proper annotation if needed.