1. 序章

Javaで作業しているときに、同時に複数の言語バージョンを使用する必要がある場合があります。

Javaプログラムがコンパイル時に1つのJavaバージョン(たとえば– Java 6)と互換性がある必要があるのは一般的ですが、開発ツールで別のバージョン(たとえば– Java 8)を使用する必要があります。アプリケーションを実行するためのおそらく異なるバージョン。

この簡単な記事では、Javaバージョンベースの非互換性セーフガードを追加するのがいかに簡単であるか、および以前に生成された署名に対してプロジェクトをチェックすることにより、ビルド時にこれらの問題にフラグを立てるためにAnimalSnifferプラグインを使用する方法を示します。

2. Javaコンパイラの-sourceおよび-targetの設定

hello world Mavenプロジェクトから始めましょう。ローカルマシンでJava7を使用していますが、Java6をまだ使用している本番環境にプロジェクトをデプロイしたいと思います。

この場合、Java6を指すsourceおよびtargetフィールドを使用してMavenコンパイラプラグインを構成できます。

「ソース」フィールドはJava言語の変更との互換性を指定するために使用され、「ターゲット」フィールドはJVMの変更との互換性を指定するために使用されます。

pom.xml:のMavenコンパイラー構成を見てみましょう。

<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>

ローカルマシン上のJava7とコンソールに「helloworld」を出力するJavaコードを使用して、Mavenを使用してこのプロジェクトをビルドすると、Java6を実行するプロダクションボックスで正しくビルドおよび動作します。

3. APIの非互換性の紹介

ここで、誤ってAPIの非互換性を導入することがいかに簡単であるかを見てみましょう。

いくつかの新しい要件に取り組み始め、Java6にはなかったJava7のいくつかのAPI機能を使用するとします。

更新されたソースコードを見てみましょう。

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

java.nio.charset.StandardCharsetsはJava7で導入されました。

ここで先に進んでMavenビルドを実行すると、コンパイルは正常に実行されますが、実行時にJava6がインストールされた本番ボックスでリンケージエラーが発生して失敗します。

Maven ドキュメントはこの落とし穴に言及しており、オプションの1つとしてAnimalSnifferプラグインを使用することを推奨しています。

4. レポートAPIの互換性

Animal Snifferプラグインは、次の2つのコア機能を提供します。

  1. Javaランタイムの署名の生成
  2. API署名に対するプロジェクトのチェック

pom.xml を変更して、プラグインを含めましょう。

<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>

ここで、Animal Snifferの設定セクションは、既存のJava6ランタイム署名を参照しています。 また、実行セクションは、問題が見つかった場合、指定された署名とフラグに対してプロジェクトのソースコードをチェックおよび検証します。

先に進んでMavenプロジェクトをビルドすると、ビルドは失敗し、プラグインは期待どおりに署名検証エラーを報告します。

[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.

5. 結論

このチュートリアルでは、Maven Animal Snifferプラグインと、ビルド時にAPI関連の非互換性がある場合はそれを報告するためにプラグインを使用する方法について説明しました。

いつものように、完全なソースコードはGitHubから入手できます。