現在、Java Compiler 11 を使用しており、主なアーティファクトを Java 11 にデプロイしています。ここでは問題ありません。
残念ながら、私たちが使用するサービスは Java 8 しかサポートしていないため、Java 8 をターゲットにしてそれらのいくつかをコンパイルします。ここでは問題ありません。
私たちの問題は、開発者が Java 8 の実行時に利用できないメソッドを参照する可能性があることです。たとえばList.of()
、バージョン 11 はそれを Java 8 にコンパイルしますが、JVM バージョン 8 で実行すると例外がスローされます。Optional::stream
javac
後者は単純な grep ステートメントで簡単に識別できますが、後者はよりトリッキーで、コード/AST を理解する必要があります。
Checkstyle、Spotbugs、および PMD のドキュメントを確認しましたが、成功しませんでした。実際、IntelliJ はこれに非常に優れていますが、CI パイプラインに統合することはできません。
そして、この素朴で単純な grep ステートメントを取得しました。
grep --recursive --extended-regexp '[ \(](List|Set|Map).of' 'our_project'
互換性のない API を正確に特定する方法が必要です。