systemPathの問題
今日マルチプロジェクトの作成で問題が発生したためメモ。
まる、マルチプロジェクトは下記のようになっている
root - pom.xml - foo -pom.xml - bar -pom.xml - lib -lib.jar
んで、fooはlib/lib.jarに依存、 barはfooに依存となってます。
ここで、foo/pom.xmlを下記のように書いてしまうと問題が。
<project> ・・・ <dependencies> ・・・ <dependency> <groupId>foo.org</groupId> <artifactId>foo</artifactId> <scope>system</scope> <version>0.0.1</version> <systemPath>${basedir}/../lib/lib.jar</systemPath> ・・・ </dependencies> ・・・ </project>
上記のように書くと、fooのcompileは通るのですが、barの時に
[WARNING] POM for 'foo.org:foo:pom:0.0.1:compile' is invalid. It will be ignored for artifact resolution. Reason: Failed to validate POM for project foo.org:foo at Artifact [foo.org:foo:pom:0.0.1:compile]
ってな感じで怒られます。どうも bar/pom.xml を処理するときに、上手くsystemPathの解決ができないからっぽい。ちゃんとフルパスで書くと解決できるため、bar/pom.xmlの解析中にbar/pom.xmlの解析に行くときに${basedir}の展開ができていないのだろう。
色々なところで systemPath に ${basedir} を使っている例を見るけど、こんなはまり方もあるので注意。
まぁ結論としては他から参照される物のdependencyにscopeがsystemな物は突っ込んじゃ駄目というこで。