Apache POIのバージョンアップ

mavenなどの ライブラリ管理ツールを使用していない状態でApache POIをバージョンアップする作業のメモです。

### 前提条件

* バージョンアップ前のPOI：3.0.2
* バージョンアップ後のPOI：4.1.2
* javaのバージョン：8
* IDE：eclipce(4.4.2)

---

### バージョンアップ前

今回は処理の内容はさほど重要ではないので簡単にエクセルに書かれた内容を読み込んでコンソールに出力する処理を書きました。

```Test1.java

import java.io.FileInputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class Test1 {

	public static void main(String[] args) {
	
        try {
            //Excelのワークブックを読み込みます。
            POIFSFileSystem filein = new POIFSFileSystem
                (new FileInputStream("C:\\poi_test\\test.xls"));
            HSSFWorkbook wb = new HSSFWorkbook(filein);
            //シートから読み込みます。
            HSSFSheet sheet = wb.getSheet("test");
            HSSFRow row = sheet.getRow(0);
            HSSFCell cell = row.getCell((short)0);
            String readText = cell.getStringCellValue();
            //Excelから読み込んだ結果を出力します。
            System.out.println(readText);
            System.out.println("処理が終了しました。");
        } catch (Exception e) {
            System.out.println("処理が失敗しました");
        }
	}
}
```
test.xls
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162114/6eb973ac-ca57-5f28-81d7-d8d7e8f11745.png)

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162114/72c162b7-97a7-5695-d8b7-09a4b848fc34.png)

今のところ、正常に動いていることが確認できました。

---

### バージョンアップ

POIのバージョンを上げていきます。

#### 古いバージョンをビルドパスから削除する

eclipceでプロジェクトを右クリック＝＞ビルド・パス＝＞ビルド・パスの構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162114/b79b88bd-5671-ee1d-0442-6b2431041967.png)

現在使用しているバージョン(3.0.2)のライブラリへのパスが記載されているので3つとも除去します。

### 新しいバージョンのインストール

https://poi.apache.org/download.html
ここから新しいバージョンのPOIをインストールして解凍し、
任意のディレクトリに配置します。


### 新しいバージョンのビルドパスを通す

再びeclipceでプロジェクトを右クリック＝＞ビルド・パス＝＞ビルド・パスの構成
して新しいバージョンのPOIのビルドパスを通します。
先ほどPOIを解凍したディレクトリから[こちらのサイト](https://itsakura.com/java-poi)を参考に以下の4つのjarファイルを選択します。

* poi-4.1.2.jar
* poi-ooxml-4.1.2.jar
* poi-ooxml-schemas-4.1.2.jar
* ooxml-lib\xmlbeans-3.1.0.jar

結果はこんな感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162114/00c6d427-5010-8aef-9230-c3673648ea1c.png)

### 動作確認

プログラムを動かしてみるとビルドエラーが発生します。

```
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/math3/util/ArithmeticUtils
	at org.apache.poi.poifs.property.RootProperty.setSize(RootProperty.java:59)
	at org.apache.poi.poifs.property.DirectoryProperty.<init>(DirectoryProperty.java:52)
	at org.apache.poi.poifs.property.RootProperty.<init>(RootProperty.java:31)
	at org.apache.poi.poifs.property.PropertyTable.<init>(PropertyTable.java:58)
	at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:102)
	at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:274)
	at Test1.main(Test1.java:16)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.math3.util.ArithmeticUtils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 7 more
```

```java.lang.NoClassDefFoundError: org/apache/commons/math3/util/ArithmeticUtils```
というエラーメッセージから推測するにおそらくapacheのライブラリが不足しているようです。
ダウンロードした新しいapacheのディレクトリを確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162114/2d793403-d1d3-5fcd-3f84-a3c4ccb8a629.png)

libフォルダの下にcommons-math3.jarというファイルが見つかりました。
このjarファイルへのビルドパスも通してあげれば解決しそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162114/8064e5d0-59ea-a8d7-a029-a091ab729e8d.png)

実行すると無事成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162114/463591f4-000c-cca7-7fd5-4ce8cdf57ffa.png)

ライブラリを入れたりバージョンアップするときはネットで参考になりそうな情報を集めることが多いと思いますが、
ネットの記事は必要最低限で書かれていることが多く、そのまま自分の環境に当てはめていいかはよく考えないといけないです。
今回の場合はエラーメッセージを冷静に確認したらわかるエラーだったので、よくわからないエラーが出ても混乱せずにエラーメッセージでググるなど落ち着いた対応を心掛けましょう。