/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

Jackson パッケージは fasterxml が新しい

少し前に、Jackson パッケージを使おうとしてハマったことがありました。

Jackson には com.fasterxml.jackson グループのモノと org.codehaus.jackson のモノがあります。Jackson は 2.0.0 以降からネーミングスペースが前者の com.fasterxml.jackson に移ったため、IDE で Jackson をインポートしようとすると、fasterxml, codehaus のどちらを選ぶかを尋ねられることがあります。ここで間違って codehaus を選ぶと古い Jackson が動いてしまい、なんとなく動きはするけれど細かい挙動が違ったりエラーが発生したりします。

私が出くわしたのは、JsonPOJO へ変換する際に、コード上は抽象クラスで定義しておいて、実際は特定のパラメータを見て具象クラスでデシリアライズする処理でした。ハマったのは、REST APIJson を変換するのは問題なかったのですが、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 で質問したポストです:

stackoverflow.com

stackoverflow.com