背景
OpenAPI Generatorは現在 Java8 での動作 が基本になっているが、一方で下記のPR/issueのようにJDK9以降のサポートを進めていく流れがある。
- Add JDK 9 support by wing328 · Pull Request #1188 · OpenAPITools/openapi-generator
- Investigate Java 9+ support · Issue #263 · OpenAPITools/openapi-generator
- Update brew formula to support JDK9 · Issue #1203 · OpenAPITools/openapi-generator
自分もこの辺に絡んでいきたい気持ちになってきたので、Java8で開発しながら、Java9(またはそれ以降のバージョン)で非推奨になった構文が手元のソースコードで使われているかチェックする方法が知りたくなった。
Twitterでつぶやいたら返信をいただけた
なにぶんJavaに慣れていないのでどうしたら良いかわからないので、Twitterでつぶやいたら返信をいただけた 🙏 感謝!!
情報源としてはJava9のリリースノートに
— なぎせ ゆうき (@nagise) 2018年12月8日
Removed APIs, Features, and Optionshttps://t.co/1I8Z7HvuxY
Deprecated APIs, Features, and Optionshttps://t.co/n1UbBwTn1W
というものがあります https://t.co/9ndZ92mjPb
とはいえ、コード中に何が含まれているかを網羅的にチェックするのは難しいので、結局Java9をインストールしてjavacで警告が出るものを探す、というのが効率的ではないかと思います
— なぎせ ゆうき (@nagise) 2018年12月8日
ふむふむ!
自分なりにやったことまとめ
以下、いただいたアドバイスをもとに自分なりにやってみたことをまとめる 📝
サンプルコード
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 (切実)