システム開発現場の道具箱

株式会社モノクレアが運営するIT技術系のブログです。システム開発の現場で役に立つ情報を掲載しています。

独習Maven 《応用編》 プラグイン

今回は《応用編》 プラグイン編と題して、 以下を目的にMavenを実行し、ビルドプラグインへの理解を深めたいと思います。

  • ライフサイクルを指定する
  • ゴールを指定する
  • ライフサイクルにプライグインを統合する

ライフサイクルを指定する

ライフサイクルを指定し、Mavenを実行してみましょう。 前回の「独習Maven 《基本編》」で行ったように、 「compile」や「test」などライフサイクル中のフェーズを指定し実行します。

myprojectディレクトリに以下の構成でjavaファイルを作成します。

myproject
|   pom.xml
|
\---src
    \---main
        \---java
                A.java

A.javaファイルには以下のソースを記述します。

public class A {

    public static void main(String[] args) {
        System.out.println("Hello Maven!");
    }

}

最後にコンソールを開き、myprojectディレクトリで以下のコマンドを実行します。

mvn clean package
java -cp target/myproject-0.1-SNAPSHOT.jar A

コンソール上に以下の様なログが表示され、javaコマンド実行後「Hello Maven!」が表示されれば成功です。

[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] :
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ myproject ---
[INFO] :
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ myproject ---
[INFO] :
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ myproject ---
[INFO] :
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ myproject ---
[INFO] :
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ myproject ---
[INFO] :
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ myproject ---
[INFO] :
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.191 s
[INFO] Finished at: 2016-XX-XXTXX:XX:XX+09:00
[INFO] Final Memory: 15M/165M
[INFO] ------------------------------------------------------------------------

mvnコマンド実行後のディレクトリ階層は以下の様になります。

myproject
|   pom.xml
|
\---src
|   \---main
|       \---java
|               A.java
|
\---target
    |   myproject-0.1-SNAPSHOT.jar
    |
    \---classes
             A.class

ゴールを指定する

次にゴールを指定し、Mavenコマンドを実行してみましょう。

mvn clean jar:jar
java -cp target/myproject-0.1-SNAPSHOT.jar A

javaコマンドを実行後、以下のメッセージが表示されると思います。

エラー: メイン・クラスAが見つからなかったかロードできませんでした

Mavenコマンド実行時のログを先ほどのログと比較すると、実行されているプラグインが違うことがわかります。

[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] :
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ myproject ---
[INFO] :
[INFO] --- maven-jar-plugin:2.4:jar (default-cli) @ myproject ---
[WARNING] JAR will be empty - no content was marked for inclusion!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.096 s
[INFO] Finished at: 2016-XX-XXTXX:XX:XX+09:00
[INFO] Final Memory: 7M/155M
[INFO] ------------------------------------------------------------------------

今回、実行したmvnコマンド実行後のディレクトリ階層は以下の様になります。
同じく先ほどのディレクトリ階層と比較するとclasses以下が出力されていません。 実行されているプラグインにより、target以下に出力されるファイルが異なることがわかります。

myproject
|   pom.xml
|
\---src
|   \---main
|       \---java
|               A.java
|
\---target
        myproject-0.1-SNAPSHOT.jar

ライフサイクル実行は、指定したフェーズまでのライフサイクル中のフェーズを順に実行します。
また、フェーズにはそれぞれプラグインのゴールがバインドされています。
例えば、先ほど実行した「package」フェーズには「jar:jar」ゴールが標準でバインドされています。 各フェーズにバインドされているゴールについては、以下を参考にしてください。

参考 https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings

ライフサイクルにプライグインを統合する

続いてライフサイクルにプラグインを統合してみましょう。 今回は例として、dependency-maven-pluginを追加します。 myproject配下のpom.xmlを開き以下の内容を貼り付けます。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>a.b.c</groupId>
  <artifactId>myproject</artifactId>
  <version>0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.4</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <configuration>
          <includeScope>runtime</includeScope>
        </configuration>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

次に以下のMavenコマンドを実行してみましょう。

mvn package

コンソール上に「BUILD SUCCESS」が表示されれば成功です。 mvnコマンド実行後のディレクトリ構造は以下になります。

myproject
|   pom.xml
|
\---src
|   \---main
|       \---java
|               A.java
|
\---target
    |   myproject-0.1-SNAPSHOT.jar
    |
    \---dependency
            commons-lang3-3.4.jar

maven-dependency-pluginのdependency:copy-dependenciesが実行され、target/dependencyにcommons-lang3-3.4.jarが出力されたことがわかります。

《応用編》① プラグイン編は以上です。
次回は《応用編》②としてリソースについて触れたいと思います。