DATE : 2006/11/28 (Tue)
Eclipse などの IDE では依存するライブラリやプロジェクトのソースコードを参照することで、そのクラスやメソッドに関するドキュメントを表示しています。
IDE で Maven を使って複数のモジュールからなるプロジェクトを開発していると、モジュール同士は Maven のローカルリポジトリを経由して参照しあうことになります。
しかしモジュールをローカルリポジトリにインストール(install フェーズを実行)すると、クラスファイルの JAR はインストールされますが、ソースコードはインストールされません。そのため、依存するモジュールのドキュメントが IDE 上で表示されないという現象が発生します。
そこでモジュールの pom.xml に設定を行い、install フェーズ実行時にソースコードもインストールされるようにします。(「...」は省略を表します)
... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build> ...
maven-source-plugin は、IDE 用などにソースコードを JAR 形式にまとめるプラグインです。このプラグインの source:jar ゴールを実行すると、テストコードを除いた全ソースコードが JAR 形式に圧縮されます。
そのため source:jar ゴールを実行するように設定すると、 install フェーズの実行中にゴールが実行されます。
<execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution>
ちなみに source:jar ゴールは標準では package フェーズに関連付けられています。install フェーズを実行すると、その直前に package フェーズの処理も行われるので、ソースコードのインストールも行われるというわけです。
なお、上の例はモジュールひとつに限定した話です。プロジェクトの全モジュールでソースコードをインストールする場合は、プロジェクト最上位の pom.xml に次の設定を行います。
... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <inherited>true</inherited> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build> ...
inherited 要素を有効にしました。この要素を有効にすることで、子モジュールにここで設定した maven-source-plugin の設定が受け継がれます。
なお、最上位の pom.xml の設定は、その pom.xml 自身がローカルリポジトリにインストールされなければ有効になりません。そのため、上の設定を終えた後は install フェーズを実行して pom.xml をインストールします。
参考文献
- Introduction to the POM
- Introduction to the Build Lifecycle
- Maven Getting Started Guide "How do I build more than one project at once?"