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な物は突っ込んじゃ駄目というこで。