レタスのかわをぜんぶむく

ぜんぶむきます

はじめてOSSにコントリビュートした

概要

github.com

上記のリポジトリに出したPullRequestが2つマージされた。
仕事でも使っていたライブラリなのでうれしい!

行った変更

  • テスト設定の変更
  • 依存するライブラリの更新

テスト設定の変更

この変更を入れる前はテストコードの一部がシステムのロケーションに依存していて
いわゆるen_USの環境でないシステム上だとmvn testに失敗するケースのある状態になっていた。

原因はxls(xlsx)ファイルのセル内にある日付形式の文字列 aa/bb/cc を読み込む際に
mm/dd/yyとするか、dd/mm/yyと解釈するかの基準が明示的に指定されていないためだった。

最初にチェックアウトしてまずテストを試した時に、日付文字列の読み込みテストで失敗してしまっていたので
多分ロケーション周りだろうと思って、Macの言語設定やタイムゾーンを色々試して通るようになったのを確認後に
mvn testJVMのパラメータを渡すにはどうすれば良いんだっけという点を調査して対応した。

知らなかったけど、maven-surefire-pluginというものがあるらしい。

https://github.com/takezoe/xlsbeans/pull/12

理由に気がつくと確かに理屈はわかるんだけど、自国以外で動作するようなコードであって
かつ言語設定が絡むようなものを実装したことがなかったので、色々調べながら対応していて勉強になった。

依存するライブラリの更新

こっちが最初解決しようとしていた問題。いわゆるJar地獄問題で
依存するライブラリが別バージョンの同じライブラリを参照していると
不幸な問題が発生することがまれによくある

今回のケースでは内部的に利用しているjavassistのバージョンに問題があった

$ mvn dependency:tree
~略~
[INFO] com.github.takezoe:xlsbeans:jar:1.2.6
[INFO] +- net.sourceforge.jexcelapi:jxl:jar:2.6.12:compile
[INFO] |  \- log4j:log4j:jar:1.2.14:compile
[INFO] +- org.apache.poi:poi:jar:3.6:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1:runtime
[INFO] |     +- logkit:logkit:jar:1.0.1:runtime
[INFO] |     +- avalon-framework:avalon-framework:jar:4.1.3:runtime
[INFO] |     \- javax.servlet:servlet-api:jar:2.3:runtime
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] |  |  +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO] |  |  \- org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:jar:1.0:compile
[INFO] |  \- dom4j:dom4j:jar:1.6.1:compile
[INFO] |     \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] +- ognl:ognl:jar:3.0.2:compile
[INFO] |  \- javassist:javassist:jar:3.11.0.GA:compile <=ココ
[INFO] \- junit:junit:jar:3.8.1:test

詳しくはPullRequestに記載しているけど、あるバージョン以下のjavassistの機能(?)をJDK8で利用すると
java.io.IOException: invalid constant type: 18というエラーを吐いて死ぬという問題がある。

https://github.com/takezoe/xlsbeans/pull/10

もちろんプロジェクト依存関係の設定側で特定バージョンの使用を強制させるワークアラウンドもあるけど
依存しているライブラリのAPIの互換性に問題がなければ、より色々なバージョンで動作した方がよいでしょう
ということで、古いjavassistを参照しないよう、ognlのバージョンを上げた差分を作ってPullRequestを出した。

オチ

両方調べて解決するのに4時間くらいかかったんだけど実際の差分はpom.xmlの数行だけ。
次回はソース部分の修正で貢献できるようにがんばります。

f:id:uskey:20190211163856p:plain:w400