あいぼーいの部屋

@I_BOY_1204がJavaやJavaScriptに関して調べた事を忘れない様につらつらと記述する備忘録です。

IntellijでChekcerFrameworkを使ったコードのビルド

JJUG CCC 2016 SpringでThe Checker Frameworkというものがあることを知ったので、早速使ってみた。

ドキュメントが全部英語で、日本語のものがなくて辛かったので今回は、Intellijを使ってビルドできるようになるまでを書く。
(英語版の設定はThe Checker Framework Manual: Custom pluggable types for Javaを参照)

(注)以下の内容で${CHECKERFRAMEWORK}はCheckFrameworkをインストール(展開)したパスです

  1. IntelliJの設定画面上で利用するJDKのバージョンを8にする
  2. プロジェクトの設定画面を開いてライブラリに以下のjarを追加する ${CHECKERFRAMEWORK}/checker/dist/checker.jar ${CHECKERFRAMEWORK}/checker/dist/javac.jar
  3. 再度、IntelliJの設定画面を開き、「Javaコンパイラ」の設定メニューを開く(場所がわからない場合は設定画面で検索すると良い) ここで「追加コマンドラインパラメータ(Additional command line parameters)に-Xbootclasspath/p:${CHECKERFRAMEWORK}/checker/dist/jdk8.jar と記述する
  4. IntelliJ設定メニュー中の「アノテーションプロセッサ」で以下の内容をセットする 「Enable annotation processing」にチェックをつける 「Processor FQ Name」に利用するチェッカーのFQクラス名を指定する(例えば、org.checkerframework.checker.nullness.NullnessChecker)

上記を実行した上で、ビルドを行うと、CheckerFrameworkで定義されているアノテーションを利用することができます。
例えば、以下のコードを実行を書いてビルドすると、

import org.checkerframework.checker.nullness.qual.NonNull;

public class NullnessExample {
    public static void main(String[] args) {
        @NonNull Object myObject = null;
        myObject = new Object();
        System.out.println(myObject.toString());

    }
}

Error:(5, 36) java: [assignment.type.incompatible] incompatible types in assignment.
found : null
required: @UnknownInitialization @NonNull Object
というような形でコンパイルエラーを出してくれます。