LoginSignup
10
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-22

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

小話

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

gem の場合

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

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

gemspec を以下のように変更。requirements にインストールしたい jar (maven レポジトリのパス)とバージョンを指定する。なお requirements は、オプションの指定が色々あるので詳細はこの辺を参照。

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 タスクを書いて

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 したタイミングでダウンロードさせる

gemspec を以下のように変更。requirements にインストールしたい jar (maven レポジトリのパス)とバージョンを指定する。なお requirements は、オプションの指定が色々あるので詳細はこの辺を参照。

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 によって 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

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9