少し前に、Jackson パッケージを使おうとしてハマったことがありました。
Jackson には com.fasterxml.jackson
グループのモノと org.codehaus.jackson
のモノがあります。Jackson は 2.0.0 以降からネーミングスペースが前者の com.fasterxml.jackson
に移ったため、IDE で Jackson をインポートしようとすると、fasterxml, codehaus のどちらを選ぶかを尋ねられることがあります。ここで間違って codehaus を選ぶと古い Jackson が動いてしまい、なんとなく動きはするけれど細かい挙動が違ったりエラーが発生したりします。
私が出くわしたのは、Json を POJO へ変換する際に、コード上は抽象クラスで定義しておいて、実際は特定のパラメータを見て具象クラスでデシリアライズする処理でした。ハマったのは、REST API で Json を変換するのは問題なかったのですが、DB から Json を文字列として読み込み、それをデシリアライズする際にうまくいかないためでした。エラーも Can not construct instance of AbstractConfig
といった分かりにくい内容でした:
16/03/24 17:17:20 ERROR (...Abbr...) org.codehaus.jackson.map.JsonMappingException: Can not construct instance of AbstractConfig, problem: abstract types can only be instantiated with additional type information
Maven でライブラリ管理をする際も、fasterxml, codehaus のどちらかに寄せるようにしないとバグの原因になりかねません。恥ずかしながら問題が起こるまではあまり気をつけていなかったので、こうしてメモするに至ります。
Hive 関連のライブラリも同じような問題があります。例えば、HiveStatement クラスを IDE で補完しようとすると、二つの候補が出てきます:
org.apache.hadoop.hive.jdbc.HiveStatement
org.apache.hive.jdbc.HiveStatement
これは後者が新しいパッケージで、Hive 1.0.0 から hadoop の下ではなく、Hive 単体としてパッケージが独立したようです。
以上2つのパッケージ問題について Stackoverflow で質問したポストです: