maven3に慣れる

はじめに

業務でmavenを利用している、正直、雰囲気で触っている。 苦手意識を克服することを目標に、mavenの学習に取り組もうと思う 公式のDocumentを読んで理解できるタイプではないため、Maven3 チュートリアルに沿って手を動かしながら学習をする

TECHSCORE(テックスコア)と迷ったが前者のほうが情報が圧倒的に新しいので、そちらを選択

ゴール

java + Spring Bootのプロジェクトを触る上で困らない程度に理解できること

環境

$ mvn -v
Apache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f)
Maven home: C:\Program Files\apache-maven-3.9.3
Java version: 17.0.2, vendor: Oracle Corporation, runtime: C:\Program Files\jdk-17.0.2
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"

1章

ケルトン(雛形)を作成

出来上がったものがこちら

$ cat .\pom.xml
<?xml version="1.0" encoding="UTF-8"?>

<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>com.example</groupId>
  <artifactId>hello</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>hello</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

pomの内容について

ケルトンを作成するときに入力したgroupId,artifactId,version,packageは以下のように反映される

  • groupId,artifactId,versionはpom.xmlに反映
  <groupId>com.example</groupId>
  <artifactId>hello</artifactId>
  <version>1.0-SNAPSHOT</version>
  • packageはプロジェクトのパッケージ構成に反映される
src\main\java\com\example

各要素が持つ意味は次の通り *1

groupId プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的です。
artifactId プロジェクトの成果物の名前。 作成する JAR や WAR, EAR ファイルなどの名前に使用されます。
version プロジェクトのバージョン。 snapshotについて:Maven SNAPSHOTの概要とリリース方法(スナップショット) - Web系開発メモ
1.6.2 TODO テストコンパイル設定

src/main配下はテスト用のコードを配置する場所ではないため、エラーになる junitdependencyから<scope>test<scope>の記載を削除してもだめ

1.6.3 TODO リソースの配置

javaフォルダ配下のhoge.txtはコピーされず、resouces配下のhoge.txtはコピーされる これは、1.5.1で出力した設定値を見ると解決する

1.7,1.8は割愛(知っている内容について記載を行うことに疲れてきた)

2章

読み物なので記載を割愛

3章

※3.1,3.2はスキップ

3.3

ライブラリ 説明 適切なスコープ そのスコープにした理由
junit.jar ユニットテスト用ライブラリ compile or runtime どこまでテストを組むのかによるけど、基本的にcompileでよいという理解
ojdbc6.jar Oracle JDBCドライバ
slf4j-api.jar ロギングライブラリ
servlet-api.jar Servlet API

4章

※割愛、私はintellijにインポートした

5章

※割愛 インハウスリポジトリを意識したことがないので、今度時間のある時に作って見ようと思います

mavenのインハウスリポジトリを作るよ - Qiita

6章

以下の設定をpomに追加
  <properties>
    <hoge.value>hoge.hoge</hoge.value>
  </properties>

=======省略======= <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <configuration> <target> <echo>project.groupId = ${project.groupId}</echo> <echo>project.artifactId = ${project.artifactId}</echo> <echo>project.version = ${project.version}</echo> <echo>project.build.directory = ${project.build.directory}</echo> <echo>env.JAVA_HOME = ${env.JAVA_HOME}</echo> <echo>hoge.value</echo> </target> </configuration> </plugin>

$ mvn antrun:run
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< example.com:maven_props >-----------------------
[INFO] Building maven_props 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- antrun:1.8:run (default-cli) @ maven_props ---
[INFO] Executing tasks

main:
     [echo] project.groupId = example.com
     [echo] project.artifactId = maven_props
     [echo] project.version = 1.0-SNAPSHOT
     [echo] project.build.directory = C:\work\maven\example\maven_props\target
     [echo] env.JAVA_HOME = C:/Program Files/jdk-17.0.2
     [echo] hoge.value
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.971 s
[INFO] Finished at: 2023-07-31T20:11:57+09:00
[INFO] ------------------------------------------------------------------------

デフォルトプロパティ,環境変数,ユーザー定義プロパティの反映状況が確認できる

7章

7.3.1

pomに以下の一文を追加することで、mvn packageを実行した際にwarがtarget配下に生成される

<packaging>war</packaging>

8章

8.1.1
以下の設定をpom.xmlに追加したことにより、verifyのフェーズでcheckstyle:checkが実行される これは、mavenのlife cycleを理解しているとinstallコマンドの実行時にverifyが実行されることが理解できる *2
  <build>
    </pluginManagement>
    ==== 割愛 ====
    <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>2.17</version>
        <executions>
          <execution>
            <id>checkstyle</id>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

9章,10章

学習先の構成と若干ずれますが、、、 学習に利用していたmavenプロジェクトのrootディレクトリからmvn archetype:generateで子プロジェクトを作成しようとしたところ、次のエラーに遭遇した
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.2.1:generate (default-cli) on project parent_pom: Unable to add module to the current project as it is not of packaging type 'pom' -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
これは、すでにmavenプロジェクトが存在しているフォルダでプロジェクトを作成しようとした場合に発生するエラーで <packaging>pom</packaging>をpom.xmlに追加することで解消する また、この記載を親pomに記載した状態で子プロジェクトを作成するとmavenが親pomにmodulesの設定を反映してくれる

参考情報

2. Maven 入門 (2) | TECHSCORE(テックスコア) *1

Mavenの「よくわらない」を解消 ! ライフサイクル、フェーズ、バインドの概念 | dawaan *2