Java8で開発しながら、Java9で非推奨になった構文が使われているかチェックする

背景

OpenAPI Generatorは現在 Java8 での動作 が基本になっているが、一方で下記のPR/issueのようにJDK9以降のサポートを進めていく流れがある。

自分もこの辺に絡んでいきたい気持ちになってきたので、Java8で開発しながら、Java9(またはそれ以降のバージョン)で非推奨になった構文が手元のソースコードで使われているかチェックする方法が知りたくなった。

Twitterでつぶやいたら返信をいただけた

なにぶんJavaに慣れていないのでどうしたら良いかわからないので、Twitterでつぶやいたら返信をいただけた 🙏 感謝!!

ふむふむ!

自分なりにやったことまとめ

以下、いただいたアドバイスをもとに自分なりにやってみたことをまとめる 📝

サンプルコード

Java9から Class.newInstance()が非推奨になった ので、これを警告してもらえることをゴールにする。

package io.github.ackintosh;

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println(String.class.newInstance());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Java8 では何事もなくコンパイルが終わる。

$ java -version
java version "1.8.0_65"

$ mvn clean compile
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< io.github.ackintosh:linttest >--------------------
[INFO] Building linttest 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ linttest ---
[INFO] Deleting /Users/akihito1/dev/linttest/target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ linttest ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ linttest ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/akihito1/dev/linttest/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.484 s
[INFO] Finished at: 2018-12-08T14:10:41+09:00
[INFO] ------------------------------------------------------------------------

コンパイル時に引数を渡す

Apache Maven Compiler Pluginでコンパイル時に引数を渡せるようにする。

pom.xml

            ...
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>${compilerArgument}</compilerArgument>
                </configuration>
            </plugin>
            ...

JDK9でコンパイルする

MavenのDockerイメージを使う。

$ docker run --rm -v (PWD):/lint -w /lint maven:3-jdk-9 mvn clean compile -DcompilerArgument=-Xlint:deprecation
...
...
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /lint/target/classes
[WARNING] /lint/src/main/java/io/github/ackintosh/Main.java:[7,44] newInstance() in java.lang.Class has been deprecated
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 49.018 s
[INFO] Finished at: 2018-12-08T05:17:09Z
[INFO] ------------------------------------------------------------------------

[WARNING] /lint/src/main/java/io/github/ackintosh/Main.java:[7,44] newInstance() in java.lang.Class has been deprecated

警告が出た!👌

終わりに

背景 に書いたが、なぜこれがやりたかったかというとOpenAPI GeneratorでJava9以降で非推奨とされている構文がどれくらい使われているかを把握するため。なので、OpenAPI Generatorで上記を試したら警告がたくさん出てきた!!

ということで、OpenAPI Generatorにコントリビュートしてみたいというかたは、ネタはありますのでぜひお願いします!!!!1 (切実)