前提
Eclipse/Tycho を使うと、にlayout=p2を指定でき、p2リポジトリの中にある OSGi bundles を Maven 内で使える。
Xtext でのコード生成には MWE2 が用いられており、Maven を用いたビルドでは exec-maven-plugin 経由で OSGi とは無関係な Java アプリケーションとして実行される。
Xtext の高度な利用では、サードパーティが作成した EMF モデル/バンドルを使う場合がある。
環境は mvn: 3.0.5、Tycho: 0.23.1、Xtext: 2.9.2
課題
exec-maven-plugin の dependency に P2 リポジトリ内にある OSGi bundle を加えたい。
検討
OSGi には、Maven での artifactId に相当する Bundle-SymbolicName は存在する。しかし、groupId の概念は無い。
試しに mvn dependency:tree
を実行してみる。
[INFO] +- p2.eclipse-plugin:org.eclipse.sphinx.emf:jar:0.8.1.201409171422:system
なるほど、p2.eclipse-plugin
が groupId か?
<!-- snip -->
<plugin>
<artifactId>exec-maven-plugin</artifactid>
<!-- snip --->
<dependencies>
<dependency>
<groupId>p2.eclipse-plugin</groupId> <!-- bingo? -->
<artifactId>org.artop.aal.autosar421</artifactId>
<version>4.4.1.201503251636</version>
</dependency>
</dependencies>
<!-- snip -->
でも、これは誤り。
正解
~/.m2/repository
を見ると、取得した p2/osgi/bundle というディレクトリがある。
(p2/eclipse-plugin
というディレクトリは無い)
そこで…
<!-- snip -->
<plugin>
<artifactId>exec-maven-plugin</artifactid>
<!-- snip --->
<dependencies>
<dependency>
<groupId>p2.osgi.bundle</groupId> <!-- Bingo! -->
<artifactId>org.artop.aal.autosar421</artifactId>
<version>4.4.1.201503251636</version>
</dependency>
</dependencies>
<!-- snip -->
が、正解、っぽい。
注意
このような dependency の記述では、OSGi bundle は単に jar ファイルとして解釈されているようだ。MANIFEST.MF にある記述を用いた依存性解決はしてくれないようなので、地味に頑張るしか無い、っぽい。
p2 リポジトリには -SNAPSHOT
の概念は無い。よって、バージョンの qualifirer は厳密に指定する必要がある。
別段の指定がない場合、 groupId として p2 osgi.bundle を指定しても、ローカルの m2 リポジトリに groupId 付きの m2 artifacts がある場合には、そちらを優先して参照しに行く。(これ、なんとなく仕様のバグではないかという気もするけれども…)