概要
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 ならかけないか。難しいかな。