jar-dependencies を使って jruby gem (or アプリケーション) の jar 依存を解決する

jar-dependencies を利用すると maven レポジトリから jar を**その依存も含めて**ダウンロードして、jar の依存解決をすることができる。もちろん、**バージョン指定もできる**。なお、jar-dependencies gem は **jruby にデフォルト**でバンドルされている。

## 小話

最初は [mkristian/jbundler](https://github.com/mkristian/jbundler) が良さそうと思って使っていたのだが、どうやら [mkristian/jar-dependencies](https://github.com/mkristian/jar-dependencies) が jruby にデフォルトでバンドルされるようになり、こちらがスタンダードになった模様。

# gem の場合

### gemリリース時にjarをバンドルしてしまいたい場合

gem に jar を入れ込んでリリースしてしまう方法

* https://github.com/mkristian/jar-dependencies#vendoring-your-jars-before-packing-the-jar
* [examples/gem-with-jar-dependencies/mygem.gemspec](https://github.com/mkristian/jar-dependencies/blob/125194b0693a653e12bb6d9eda076f4aa45a4c56/examples/gem-with-jar-dependencies/mygem.gemspec)

gemspec を以下のように変更。`requirements` にインストールしたい jar (maven レポジトリのパス)とバージョンを指定する。なお `requirements` は、オプションの指定が色々あるので詳細は[この辺](https://github.com/mkristian/jar-dependencies/blob/125194b0693a653e12bb6d9eda076f4aa45a4c56/example/example.gemspec#L25-L45)を参照。

```rb:gemspec
  # important so jar-dependencies knows it should look for
  # jar declarations in the requirements section !
  s.platform = 'java'

  s.requirements << "jar org.bouncycastle:bcpkix-jdk15on, 1.49"

  s.files += Dir['lib/*.jar']
```

次のような rake タスクを書いて

```rb:Rakefile
require 'jars/installer'
task :install_jars do
  Jars::Installer.vendor_jars!
end
```

`bundle exec rake install_jars` しておくと、`lib` 以下に jar ファイルが vendoring される。
jar が gem に含まれるように gemspec に `s.files += Dir['lib/*.jar']` と書いている。


補足: `jar-dependencies` は jruby に標準で bundle されているので、gemspec に追加不要。

補足: `~/.m2/repository` に jar がダウンロードされ、それが lib に vendoring (コピー)される。`JARS_HOME` 環境変数で `~/.m2/repository` のパスは変更できる。


### gemインストール時にjarをダウンロードしたい場合

gem には jar を入れ込まずに、ユーザが gem install したタイミングでダウンロードさせる

* https://github.com/mkristian/jar-dependencies#reduce-the-download-and-reuse-the-jars-from-maven-local-repository
* [example/gem-with-empty-jar-and-jar-dependencies.gemspec](https://github.com/mkristian/jar-dependencies/blob/125194b0693a653e12bb6d9eda076f4aa45a4c56/example/example.gemspec)

gemspec を以下のように変更。`requirements` にインストールしたい jar (maven レポジトリのパス)とバージョンを指定する。なお `requirements` は、オプションの指定が色々あるので詳細は[この辺](https://github.com/mkristian/jar-dependencies/blob/125194b0693a653e12bb6d9eda076f4aa45a4c56/example/example.gemspec#L25-L45)を参照。

```rb:gemspec
  # important so jar-dependencies knows it should look for
  # jar declarations in the requirements section !
  s.platform = 'java'

  s.requirements << "jar org.bouncycastle:bcpkix-jdk15on, 1.49"

  s.add_runtime_dependency 'jar-dependencies', "~> 0.3.5"
```

runtime dependency に `jar-dependencies` を書いておくと、[rubygems_plugin.rb](https://github.com/mkristian/jar-dependencies/blob/125194b0693a653e12bb6d9eda076f4aa45a4c56/lib/rubygems_plugin.rb) によって gem インストール時に post install が発動して、依存 jar をダウンロードしてくれるようになる。

補足: `~/.m2/repository` に jar がダウンロードされ、それが lib に vendoring (コピー)される。
なので、`~/.m2/repository` にすでに存在していれば再度ダウンロードされることなく、vendoring (コピー)が行われる。`JARS_HOME` 環境変数で `~/.m2/repository` のパスは変更できる。


注意: jruby にデフォルトで bundle されている jar-dependencies と同じバージョンに合わせないと、起動時に以下のようなエラーが出てしまうもよう。解決待ち。

```
Gem::LoadError: You have already activated jar-dependencies 0.3.5, but your Gemfile requires jar-dependencies 0.3.10.
```

### rubyスクリプトからのjar読み込み

Vendoring されると、`lib/gem-name_jars.rb` のようなファイルが作られる (例: [triglav-agent-hdfs_jars.rb](https://github.com/triglav-dataflow/triglav-agent-hdfs/blob/c53f09eff7ed757c3fd420a298fe16c378f53cf8/lib/triglav-agent-hdfs_jars.rb)) ので jar ライブラリにアクセスする ruby ファイル内で、以下のように require する。

```rb
require 'gem-name_jars'
```

# アプリケーションの場合

To be written

#