java.lang.ClassCastException: com.sun.tools.javac.code.Type$1 cannot be cast to javax.lang.model.type.DeclaredTypeが出たらテストで使うコードがエラーになってるぽい
AndroidX対応を進めていたら自分でつくって自分で使っているFragment生成周りが便利になるhttps://github.com/sys1yagi/fragment-creatorが適切にAndroidX対応できてないぽいことがわかり、いろいろと更新してたらテストで次のエラーがでてこけるようになってしまった。
java.lang.RuntimeException: java.lang.ClassCastException: com.sun.tools.javac.code.Type$1 cannot be cast to javax.lang.model.type.DeclaredType
これはアノテーションプロセッサで型チェックをしている場所で起こる。
compile-testingで読み込むJavaFileObjectがコンパイルできない場合に起こる
色々調べてみると、https://github.com/google/compile-testingで読み込むテスト用のJavaファイルをロードする時、Javaファイルで使ってるクラスを解決できない場合起こるぽいという事がわかった。設定をいじったから色々変になったのかな〜と思っていたのだけど、テストで使うコードのクラスパスが通ってない結果起こるエラーだとは...。
ということでテストで使うコード(たとえば
https://github.com/sys1yagi/fragment-creator/blob/master/processor/src/test/assets/TypeSerializerFragment.java )を見るとandroidx.fragment.app.Fragment
を使うようになっていた。なるほどテストのクラスパスにandroidx.fragment:fragment
を通さないといけないらしい。
先人のコードを参考にする
JSR269周りでAndroidX対応を始めたタイミングとしては大分後発だと思うのできっと先人達がいい感じにしてるに違いないということでいくつかのリポジトリを渡り歩いた。
めちゃくちゃドンピシャだったのがPermissionsDispatcher
で、ほぼ全体的に参考にさせてもらった。わいわい。
Replace deprecated "com.google.android" dependency with android.jar · permissions-dispatcher/PermissionsDispatcher@a5e0cac · GitHub
参考になったのは大きく2点
- 動的にローカルのandroid.jarを参照することで
com.google.android:android:4.1.1.4
の依存を外す (Jetifierがエラーになってしまうため The AndroidX namespace for Jetpack libraries is now stable! : androiddev ) - AARをJarに展開する (processorはただのJavaプロジェクトなのでAARを参照できない)
おわりに
AndroidXをサポートした Fragment Creator 2.0.0でました。