Mavenの孊習

📢 この蚘事は gemini-3-flash-preview によっお翻蚳されたした

Mavenは、Javaプロゞェクトの管理ずビルドを行うためのツヌルだよ。

Mavenを䜿うず、プロゞェクトが䟝存しおいるリ゜ヌスjarパッケヌゞを簡単か぀スピヌディに管理できお、バヌゞョンの衝突も避けられるんだ。暙準的で統䞀されたプロゞェクト構造や、プラットフォヌムに䟝存しない自動ビルド方法も提䟛しおくれるよ。

むンストヌル

公匏サむト でダりンロヌドしお解凍したら、ロヌカルリポゞトリを蚭定しよう。conf/setting.xml の <localRepository> を特定のディレクトリに倉曎するんだ。

1
2
<!-- 䟋えばロヌカルリポゞトリを D:\develop\maven_repo にする堎合 -->
<localRepository>D:\develop\maven_repo</localRepository>

アリババクラりドAliyunのプラむベヌトミラヌを蚭定するには、conf/setting.xml の <mirror> タグ内に子タグを远加しおね。

1
2
3
4
5
6
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

環境倉数の蚭定MAVEN_HOME をMavenの解凍ディレクトリにしお、その䞭の bin ディレクトリを PATH 環境倉数に远加しよう。


むンストヌル完了のテストコマンドラむンで mvn -v を入力しお出力を確認しおみお。

䟝存関係の蚭定

䟝存関係Dependencyプロゞェクトの実行に必芁な jar パッケヌゞのこず。1぀のプロゞェクトに耇数の䟝存関係を導入できるよ。

蚭定の手順

  1. pom.xml に <dependencies> タグを曞く
  2. <dependencies> タグの䞭で <dependency> を䜿っお座暙を導入する
  3. 座暙の groupId, artifactId, version を定矩する
  4. 蚭定を曎新しお、新しく远加した座暙を取り蟌む
1
2
3
4
5
6
7
8
<!-- 䟋えば logback を導入する堎合 -->
<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>

䟝存関係の座暙情報は https://mvnrepository.com/ で探せるよ。

䟝存関係の掚移

䟝存関係には掚移性があるんだ。

  • 盎接䟝存今のプロゞェクトで䟝存蚭定を通じお盎接䜜られた䟝存関係。
  • 間接䟝存䟝存しおいるリ゜ヌスが他のリ゜ヌスに䟝存しおいる堎合、今のプロゞェクトも間接的にそのリ゜ヌスに䟝存するこずになる。

䟝存関係を远加したずき、そのパッケヌゞが他のパッケヌゞに䟝存しおいれば、関連するパッケヌゞも自動的に远加されるよ。


もちろん、あるパッケヌゞのサブパッケヌゞが必芁ない堎合は、䟝存関係を陀倖するこずもできる䟝存を自ら断ち切るリ゜ヌスに぀いおは、バヌゞョンを指定する必芁はないよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<!-- 䟋えばあるプロゞェクトの junit を陀倖する堎合 -->
<dependency>
    <groupId>com.yexca</groupId>
    <artifactId>maven-project</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

䟝存関係のスコヌプ

䟝存しおいる jar パッケヌゞは、デフォルトではどこでも䜿えるけど、<scope>...</scope> を䜿っおその有効範囲を蚭定できるんだ。

  • メむンプログラムの範囲で有効main フォルダ内
  • テストプログラムの範囲で有効test フォルダ内
  • パッケヌゞングしお実行する際に含たれるかpackage コマンドの範囲内
scopeの倀メむンプログラムテストプログラムパッケヌゞング (実行)䟋
compile (デフォルト)YYYlog4j
test-Y-junit
providedYY-servlet-api
runtime-YYjdbc ドラむバ
1
2
3
4
5
6
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
</dependency>

ラむフサむクル

Maven のラむフサむクルは、すべおの Maven プロゞェクトのビルドプロセスを抜象化しお統䞀するためにあるんだ。

Maven には、互いに独立した 3 ぀のラむフサむクルがあるよ

  • clean掃陀䜜業
  • defaultコア䜜業コンパむル、テスト、パッケヌゞング、むンストヌル、デプロむなど
  • siteレポヌト生成、サむト公開など

それぞれのラむフサむクルはいく぀かのフェヌズphaseで構成されおいお、フェヌズには順番があるんだ。埌のフェヌズは前のフェヌズに䟝存しおいるよ。

clean

  • pre-clean
  • clean前回ビルドで生成されたファむルtarget フォルダを削陀する
  • post-clean

default

  • validate
  • initialize
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources
  • compileプロゞェクトの゜ヌスコヌドをコンパむルする
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources
  • test-compile
  • process-test-classes
  • test適切なナニットテストフレヌムワヌクjunitを䜿っおテストを実行する
  • prepare-package
  • packageコンパむル埌のファむルを jar や war などにパッケヌゞングする
  • verify
  • installプロゞェクトをロヌカルリポゞトリにむンストヌルする
  • deploy

site

  • pre-site
  • site
  • post-site
  • site-deploy

同じラむフサむクルの䞭で埌のフェヌズを実行するず、それより前のフェヌズもすべお実行されるよ。

マルチモゞュヌル蚭蚈

マルチモゞュヌル蚭蚈ずは、プロゞェクトの蚭蚈段階で倧きなプロゞェクトをいく぀かのモゞュヌルに分割するこず。各モゞュヌルは独立しおいお、別のモゞュヌルの機胜が必芁になったら、そのモゞュヌルを䟝存関係ずしお远加するだけでいいんだ。

共通の゚ンティティクラスやツヌルクラスを独立したモゞュヌルにしおおけば、あるモゞュヌルでそれを䜿いたい時に察応する䟝存関係を入れるだけで枈むよ。

プロゞェクトの管理・メンテナンス・拡匵がしやすくなるし、モゞュヌル間の呌び出しやリ゜ヌスの共有も䟿利になるんだ。

継承

Lombok みたいな䟝存関係は、プロゞェクトの党モゞュヌルで䜿うかもしれないよね。各モゞュヌルで毎回宣蚀するのは面倒だけど、継承を䜿えばこの問題を解決できるよ。

継承関係

芪プロゞェクトを䜜成しお、モゞュヌル共通の䟝存関係を芪プロゞェクトにたずめお蚭定するんだ。子プロゞェクトが芪プロゞェクトを継承すれば、䟝存関係も継承されるから、各子プロゞェクトで蚭定する必芁がなくなるよ。

継承は 2 ぀のプロゞェクト間の関係を衚すもので、Java の継承ず䌌おいるんだ。子プロゞェクトは芪プロゞェクトの蚭定情報を継承できる。特によくあるのが䟝存関係の継承で、これによっお䟝存蚭定を簡略化し、䞀括管理できるようになるよ。

1
2
3
4
5
6
7
<!--芪プロゞェクトを指定-->
<parent>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <relativePath>....</relativePath>
</parent>

JavaWeb 開発なら、芪プロゞェクトに spring-boot-starter-parent を継承させお、他のモゞュヌルがその芪プロゞェクトを継承する圢にできるね。

普通、ファむル構造䞊では、子プロゞェクトは芪プロゞェクトのサブディレクトリになるよ。

以䞋は䟋

  1. 芪プロゞェクトのパッケヌゞング方匏を pom にする
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.5</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>net.yexca</groupId>
<artifactId>tlias-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

Maven のパッケヌゞング方匏

  • jar通垞のモゞュヌル。SpringBoot プロゞェクトは基本 jar パッケヌゞtomcat 内蔵で動く。
  • war通垞の Web プログラム。倖郚の tomcat サヌバにデプロむしお動かす必芁がある。
  • pom芪プロゞェクトや集玄プロゞェクト。このモゞュヌルにはコヌドを曞かず、䟝存関係の管理だけを行う。
  1. 子プロゞェクトで芪プロゞェクトを指定する
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<parent>
    <groupId>net.yexca</groupId>
    <artifactId>tlias-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 芪プロゞェクトのpomファむルの盞察パスを指定指定しない堎合はロヌカル/リモヌトリポゞトリから探される -->
    <relativePath>../tlias-parent/pom.xml</relativePath>
</parent>

<!-- <groupId>net.yexca</groupId> 
-	芪プロゞェクトから自動継承されるので省略可胜
-->
<artifactId>tlias-utils</artifactId>
<version>1.0-SNAPSHOT</version>
  1. 芪プロゞェクトで共通の䟝存関係を蚭定する
1
2
3
4
5
6
7
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>
</dependencies>

バヌゞョンロック

䞀郚のモゞュヌルには必芁だけど、他のモゞュヌルには必芁ない䟝存関係がある堎合、芪プロゞェクトで䟝存関係の version を管理しおおくず、倉曎が楜になるよ。

<dependencyManagement> タグで䟝存関係のバヌゞョンを管理できるんだ。

芪プロゞェクト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<!--䟝存関係のバヌゞョンを䞀括管理-->
<dependencyManagement>
    <dependencies>
        <!--JWTトヌクン-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

子プロゞェクト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<dependencies>
    <!--JWTトヌクン-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <!-- <version>0.9.1</version>
		- 芪プロゞェクトでバヌゞョンが指定されおいるので、蚘入䞍芁
		-->
    </dependency>
</dependencies>

芪プロゞェクトの <dependencyManagement> 蚭定はバヌゞョンを管理するだけで、䟝存関係を子プロゞェクトに自動導入するこずはないよ。子プロゞェクト偎で導入しお初めお䜿えるようになるんだけど、その時にバヌゞョン番号を指定する必芁がなくなるんだ。

䞀方で、<dependencies> は䟝存関係を子プロゞェクトに匷制的に継承させるよ。

プロパティ蚭定

カスタムプロパティを䜿っお、芪プロゞェクトで䟝存関係のバヌゞョンを䞀箇所で管理・メンテナンスするこずもできるよ。

プロパティの定矩

1
2
3
<properties>
    <lombok.version>1.18.24</lombok.version>
</properties>

プロパティの匕甚

1
2
3
4
5
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
</dependency>

これで芪プロゞェクトにすべおのバヌゞョン番号をたずめお管理できるね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>

    <lombok.version>1.18.24</lombok.version>
    <jjwt.version>0.9.1</jjwt.version>
    <aliyun.oss.version>3.15.1</aliyun.oss.version>
    <jaxb.version>2.3.1</jaxb.version>
    <activation.version>1.1.1</activation.version>
    <jaxb.runtime.version>2.3.3</jaxb.runtime.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
</dependencies>

<!--䟝存関係のバヌゞョンを䞀括管理-->
<dependencyManagement>
    <dependencies>
        <!--JWTトヌクン-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${jjwt.version}</version>
        </dependency>

        <!--アリババクラりドOSS-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>${aliyun.oss.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>${activation.version}</version>
        </dependency>
        <!-- 2.3.3以䞋掚奚 -->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>${jaxb.runtime.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

䟝存関係のバヌゞョンを倉曎したいずきは、芪プロゞェクトのカスタムプロパティの倀を曞き換えるだけで OK だよ。

集箄

あるモゞュヌルが別のモゞュヌルに䟝存しおいる堎合、そのモゞュヌルをパッケヌゞングする前に、たず䟝存先のモゞュヌルをロヌカルリポゞトリに install しないずいけないんだ。䟝存モゞュヌルが倚いず、この操䜜がすごく面倒だよね。

Maven の集玄Aggregationを䜿えば、プロゞェクトの䞀括ビルドクリヌン、コンパむル、テスト、パッケヌゞ、むンストヌルなどが簡単にできるよ。

  • 集玄 耇数のモゞュヌルを䞀぀の党䜓ずしおたずめ、同時にプロゞェクトを構築するこず。
  • 集玄プロゞェクト ビゞネス機胜を持たない「空」のプロゞェクトpom ファむルのみを持぀。䞀般的に、継承関係の芪プロゞェクトず集玄プロゞェクトは同じものにするよ。
  • 圹割 プロゞェクトの高速ビルド䟝存関係に合わせお手動でビルドする必芁がなく、集玄プロゞェクトでビルドすれば完了する。

集玄プロゞェクトの <modules> タグで、含たれる子モゞュヌルの名称を蚭定できるんだ。

1
2
3
4
5
6
7
<!--他のモゞュヌルを集玄-->
<modules>
    <!-- プロゞェクトのパス -->
    <module>../tlias-pojo</module>
    <module>../tlias-utils</module>
    <module>../tlias-web-management</module>
</modules>

あずは集玄プロゞェクトでコンパむルやパッケヌゞング、むンストヌルの操䜜をするだけで、他のプロゞェクトも自動的に同期しお実行されるよ。

継承集玄
圹割䟝存蚭定の簡略化、䟝存関係の䞀括管理プロゞェクトの高速ビルド
共通点パッケヌゞング方匏はいずれも pom で、通垞䞀぀の pom にたずめるいずれも蚭蚈甚のモゞュヌルで、実際の䞭身コヌドはない
盞違点子モゞュヌル偎で関係を蚭定する。
芪モゞュヌルはどの子が自分を継承しおいるか知らない
集玄プロゞェクト偎で関係を蚭定する。
集玄プロゞェクトはどのモゞュヌルが集玄されおいるか知っおいる

プラむベヌトリポゞトリ私服

プラむベヌトリポゞトリ私服は特殊なリモヌトリポゞトリで、ロヌカルネットワヌク内に蚭眮されるリポゞトリサヌビスだよ。倖郚の䞭倮リポゞトリを代理し、チヌム内郚でのリ゜ヌス共有や同期の問題を解決するために䜿われるんだ。

プロゞェクトでサヌドパヌティの䟝存関係を䜿うずき、ロヌカルリポゞトリになければ自動的に私服に繋いでダりンロヌドする。私服にもなければ、私服が䞭倮リポゞトリに繋いでダりンロヌドし、それを私服内ずロヌカルリポゞトリの䞡方に保存しおくれるよ。

私服は普通、䌚瀟に1台あるものだから、自分䞀人で蚭定するこずはあたりないかな。

リポゞトリの皮類ずプロゞェクトバヌゞョン

私服リポゞトリの説明

  • RELEASE自瀟開発した RELEASEリリヌスバヌゞョンのリ゜ヌスを保存する。
  • SNAPSHOT自瀟開発した SNAPSHOTスナップショットバヌゞョンのリ゜ヌスを保存する。
  • Central䞭倮リポゞトリからダりンロヌドしおきた䟝存関係を保存する。

プロゞェクトバヌゞョンの説明

  • RELEASEリリヌス版機胜が安定し、曎新が止たった、配垃可胜なバヌゞョン。私服の RELEASE リポゞトリに保存される。
  • SNAPSHOT快照版機胜が䞍安定で、開発途䞭のバヌゞョン。私服の SNAPSHOT リポゞトリに保存される。

蚭定

私服ぞのアクセスのためのナヌザヌ名ずパスワヌドを蚭定しよう。Maven むンストヌルディレクトリの conf/settings.xml の servers に蚭定するよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<servers>
<server>
    <id>maven-releases</id>
    <username>admin</username>
    <password>admin</password>
</server>
    
<server>
    <id>maven-snapshots</id>
    <username>admin</username>
    <password>admin</password>
</server>
</servers>

私服から䟝存関係をダりンロヌドするためのリポゞトリグルヌプのアドレスを蚭定する。ファむルは同じく settings.xml の mirrors ず profiles タグの䞭だよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<mirrors>
<mirror>
    <id>maven-public</id>
    <mirrorOf>*</mirrorOf>
    <url>http://127.0.0.1:8081/repository/maven-public/</url>
</mirror>
</mirrors>

<profiles>
<profile>
    <id>allow-snapshots</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    <repositories>
        <repository>
            <id>maven-public</id>
            <url>http://127.0.0.1:8081/repository/maven-public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
</profiles>

pom.xml にアップロヌド先のアドレスを蚭定しよう。芪プロゞェクトで蚭定すれば OK だよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<distributionManagement>
    <!-- RELEASE版の公開先アドレス -->
    <repository>
        <id>maven-releases</id>
        <url>http://127.0.0.1:8081/repository/maven-releases/</url>
    </repository>

    <!-- SNAPSHOT版の公開先アドレス -->
    <snapshotRepository>
        <id>maven-snapshots</id>
        <url>http://127.0.0.1:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

蚭定ができたら、芪プロゞェクトの deploy ラむフサむクルを実行すれば、プロゞェクトが私服リポゞトリに公開されるよ。

Visits Since 2025-02-28

Hugo で構築されおいたす。 | テヌマ Stack は Jimmy によっお蚭蚈されおいたす。