概要

meson (& ninja) でビルドする java プロジェクトにおいて 外部 jar ライブラリをインポートさせる方法を解説する。

特に、外部 jar ライブラリをインポートするサンプルプロジェクトを GitHub にアップロードした。 https://github.com/RollMan/meson_java_classpath_delimiter_test

方法

import したい .jar ライブラリを file 型で記述する。 そのファイルを jar()objects パラメータ [1] に指定する。

meson.build の例:

jarlib = files(
  'jarlib/JarLib.jar`,
)
exe = jar('JavaDelimiterTest', 'JavaDelimiterTest.java',
  main_class : 'JavaDelimiterTest',
  install : false,
  dependencies : [src_dep, subproj_dep],
  objects : jarlib,
)

コンパイル可能で完全なプロジェクトの例を GitHub にアップロードした。 https://github.com/RollMan/meson_java_classpath_delimiter_test

感想

最初は jar()java_args パラメータを指定し手動で --class-path を構成することによって 外部 jar ライブラリをリンク (?) しようとしていたが、 Windows でコンパイルしようとした場合のみ --class-path が冗長になりかつ その delimiter が ; にならない部分があってコンパイルができていなかった。

この挙動はバグだと思っていたので 24 pull request のネタになるかと思っていた。 それがバグかどうかはともかく、結局はやり方が間違っていた。 その部分では PR にならなく、残念。

delimiter に関する挙動は調査中。 jarlib の扱いは --class-path を作って declare_dependency()compile_args においているだけなので、そのあたりでなにかコンパイルフラグを追加するだけではない処理を しているのかもしれないし、あるいは自分で dependency graph に多重辺を作ってしまっているのかもしれない。 結局、そもそも正しいやり方があるのでこれを追及する気はあまりない。

meson の java に関するドキュメントはまだ薄いようで、理解するのにはそこそこ苦労したので ドキュメント周りで contribution できないか考え中。

jar()object のドキュメントには

List of object files that should be linked in this target. [1]

とある。最初は外部 jar ライブラリを使うことを link というとは思わず、 C/C++ 関係の記述が漏れているのだと思っていたが、link というのであるならば 完全なドキュメントがあることになり完全に自分の過失なので contribution ポイントはないかもしれない。 Tutorial や Test ならかけないか。難しいかな。

References