jar-dependencies を利用すると maven レポジトリから jar をその依存も含めてダウンロードして、jar の依存解決をすることができる。もちろん、バージョン指定もできる。なお、jar-dependencies gem は jruby にデフォルトでバンドルされている。
小話
最初は mkristian/jbundler が良さそうと思って使っていたのだが、どうやら 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
gemspec を以下のように変更。requirements
にインストールしたい jar (maven レポジトリのパス)とバージョンを指定する。なお requirements
は、オプションの指定が色々あるので詳細はこの辺を参照。
# 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 タスクを書いて
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
gemspec を以下のように変更。requirements
にインストールしたい jar (maven レポジトリのパス)とバージョンを指定する。なお requirements
は、オプションの指定が色々あるので詳細はこの辺を参照。
# 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 によって 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) ので jar ライブラリにアクセスする ruby ファイル内で、以下のように require する。
require 'gem-name_jars'
アプリケーションの場合
To be written