Mavenを利用して、好きなJavaライブラリを環境に追加する。

## **はじめに**

ちょっと前に自作したJavaの動画エンコードアプリをメンテしようと思ったのですが、環境が変わると再度外部ライブラリ(JavaCV, JavaCPP)周りをまた構築しなければならない作りになっていました。(流石Windowsアプリ初心者、いけてない)

というわけで、いつでも簡単にJavaCVが使えるようMaven環境を作成したのでその覚書です。

## **Mavenとは？**

色々あると思いますが、本記事でのポイントになることだけ抜粋。

1. ビルド情報はpom.xmlファイルに記載すればOK！
2. 必要なJavaのライブラリは、pom.xmlに記載すれば**Mavenリポジトリから依存するライブラリを含め自動的にダウンロードしてきてくれる**

本記事では2のpom.xmlに関する記載方法を紹介します。

Mavenについては[こちらの記事](https://qiita.com/tarosa0001/items/e5667cfa857529900216)で環境構築まで丁寧に記載してくれているので、興味のある方は参照ください。

## **Mavenを利用したライブラリ追加。JavaCVの例**

### **公式サイトでインストール方法の確認**

#### JavaCVの設定

JavaCVとは、画像変換ツールであるOpenCVと動画エンコードツールであるFFmpegの両方がJavaで使用できる便利なツールです。

[公式サイト](https://github.com/bytedeco/javacv)を確認すると、Mavenの記載方法が書いていますね。

```xml:pom.xml
  <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.4.2</version>
  </dependency>
```

なるほど、これだけでいいのかと思いながら読み進めると、JavaCPP Presetsというのも必要らしいです。実はこちらにOpenCV, FFmpegの本体と関連している処理が含まれるのでこちらも必須になります。

#### JavaCPPの設定

というわけで[JavaCPPの公式サイト](https://github.com/bytedeco/javacpp-presets#downloads)も確認。

```xml:pom.xml
  <dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>${moduleName}-platform</artifactId>
    <version>${moduleVersion}-1.4.2</version>
  </dependency>
```

こちらも書いてますね、よし完了！…って、moduleNameとmoduleVersionって何なんだ？

### groupIdでサポートしているartifactを確認する。

JavaCPPはMavenリポジトリ内に色々なartifactを含んでいるため、使いたいものを抜粋する必要があります。しかもバージョンも合わせる必要があったりと調べるのが面倒だったり。
とにかく調べてみます。

#### **リポジトリからartifactを確認**

javacpp-presetsでググっていると、以下のリポジトリサイトを見つけました。
https://mvnrepository.com/
ピンポイントで調べる際は`https://mvnrepository.com/artifact/グループID`でOK。

今回の対象である[org.bytedeco.javacpp-presets](https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets)を指定してみると、こんな感じでいくつかのartifactが出てきます。

<img width="627" alt="maven.png" src="https://qiita-image-store.s3.amazonaws.com/0/252277/51d8e208-c210-c032-90a7-6ba89a483dc7.png">

今回はFFmpegとOpenCVだったのでffmpeg-platformとopencv-platformの内容を確認。するとこのようにサポートしているVersion情報が出てきます。

<img width="633" alt="maven_version.png" src="https://qiita-image-store.s3.amazonaws.com/0/252277/9b55d8c3-979a-4f03-fe3a-24f9724cd5a2.png">

上記の例でJavaCPPの公式サイトと比較すると、moduleName⇒ffmpeg-platform, moduleVersion⇒4.0.1-1.4.2となるようですね。

### **最終的な設定**

上記を参考に以下のようにpom.xmlにdependencyを追加しました。ビルド結果、無事ビルドが通り作成していたJavaアプリケーションが動作するようになりました。
やったー！

```xml:pom.xml
    <dependency>
    	<groupId>org.bytedeco</groupId>
    	<artifactId>javacv-platform</artifactId>
    	<version>1.4.2</version>
    </dependency>
    <dependency>
	    <groupId>org.bytedeco.javacpp-presets</groupId>
	    <artifactId>opencv-platform</artifactId>
	    <version>3.4.2-1.4.2</version>
    </dependency>
    <dependency>
	    <groupId>org.bytedeco.javacpp-presets</groupId>
	    <artifactId>ffmpeg-platform</artifactId>
	    <version>4.0.1-1.4.2</version>
    </dependency>
```

## **最後に**

今回は特に**dependencyのversionってどうやって調べるんだ？**という点を残しておきたくて記事にしました。

こうやって見ていると、最近の開発は

- ビルド環境⇒MavenやGradle
- 動作ツール⇒rubyのgemやpythonのpip、Linuxのapt/yum
- 動作環境⇒Docker

と、いつでもどこでも同じものを使えるようにするというのが一般的ですね。
社内の閉じた環境等で開発していると触れる機会が少なかったりしますが、自作で新しいツールを作るのであれば、こういった便利な機能は積極的に使っていきたいです。

## **参考**
Mavenのベース:[【超初心者向け】Maven超入門](https://qiita.com/tarosa0001/items/e5667cfa857529900216)
最初に参考にした記事: [Eclipse+Maven という便利な開発環境をインストールからプロジェクト作成まで](https://qiita.com/daikuro/items/4d4d694ddb3cc620bee1)