Published on

maven基礎とpom.xml

Authors
  • avatar
    Name
    Kikusan
    Twitter

Refs

install

2020/12のEclipseには最初から入っていたので割愛。
公式はhttps://maven.apache.org/download.cgi

mavenコマンド

  • mvn install : ローカルリポジトリに依存関係をキャッシュする。デフォルト位置は ~/.m2/repository
  • mvn compile : target/classesにコンパイル結果を出力する
  • mvn package : target/ にjarファイルを出力する
  • mvn test : **/Test*.java, *Test.java, *TestCase.java をテストする
  • mvn clean : target配下のファイルを削除する
  • mvn deploy : pom.xmlに設定されているリモートリポジトリにデプロイする

これらのコマンドはmavenではフェーズと呼ばれる。フェーズの中での処理はすべてmavenのプラグインによって行われている。
プラグインにはgoalというタスクがいくつか設定されていて、コマンドかpom.xmlの設定で呼び出す。

# mvn <prefix>:<goal> javadoc生成のコマンドは例えば
mvn javadoc:javadoc

maven のフェーズ

mavenのビルドには処理のまとまりであるフェーズがあり、
フェーズをまとめてライフサイクルと呼ぶ。
mavenの組み込みライフサイクルには以下がある。

  • default : プロジェクトをビルドしてデプロイする。
  • clean : 成果物を削除する。
  • site : Webサイトを生成する。

各ライフサイクルのフェーズには、そのフェーズで実行するプラグインのゴールが紐付けられている。 フェーズとプラグインのゴールを紐づけるには、プラグイン設定の <execution> で行う。

各フェーズを行うためには、ライフサイクルで前の手順として定義されているフェーズはすべて完了しなければならない。
(そのためmvn deployのときにはtestも行われる。)

pom.xml

  • project : プロジェクトの基本情報を書く。
  • properties : 変数の値を指定できる。${}で利用する。ここにmavenのcompiler versionを指定する。プロジェクトのJREと一緒にするのが無難
  • dependencies : 依存関係を書く。セントラルリポジトリの検索はhttps://search.maven.org/
  • build : 出力形式を書く。実行可能jarやspringアプリ, resourcesを省いたjarなどを出力するときはここをいじる。
<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>jp.co.pkg</groupId>
  <artifactId>xxxxx</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <name>cloudsign</name>
  <url>http://maven.apache.org</url>

  <properties>
    <java.version>11</java.version>
    <!-- コンパイラの指定 -->
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build />
  <dependencies />  

</project>

継承

https://maven.apache.org/pom.html#Inheritance

親プロジェクトから依存関係やプロファイルなど様々なものを流用できる。

  <parent>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>my-parent</artifactId>
    <version>2.0</version>
    <relativePath>../my-parent</relativePath> <!-- リポジトリ検索の前にパス検索を行う -->
  </parent>

アグリゲーション

modulesで一連のビルド順を指定できる。

  <modules>
    <module>my-project</module>
    <module>another-project</module>
    <module>third-project/pom-example.xml</module>
  </modules>

依存関係の追加

  <!-- slf4j + logbackを追加 -->
  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.30</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

依存関係を含んだjarの作成

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>

実行可能jarの作成

  <build>
    <!-- 実行可能jarファイル用のプラグイン -->
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <fileName>${artifactId}-${version}</fileName>
          <finalName>test</finalName>
          <descriptorRefs>
            <!-- 依存するリソースをすべてjarに同梱する -->
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>jp.co.pkg.xxxxx.App</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

特定のリソースを含まないjarの作成

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <!-- jarファイルに含まないリソースはexcludesタグで指定する -->
        <excludes>
          <exclude>*</exclude>
        </excludes>
      </resource>
    </resources>
  </build>