Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~
Search
荻原利雄
May 31, 2026
Technology
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~
荻原利雄
May 31, 2026
More Decks by 荻原利雄
See All by 荻原利雄
実践ArchUnit ~実例による検証パターンの紹介~
ogiwarat
2
1.5k
Spring Frameworkの新標準!? ~ RestClientとHTTPインターフェース入門 ~
ogiwarat
4
3k
Spring Boot vs MicroProfile ~クラウドネイティブにおけるフレームワークの比較と選択~
ogiwarat
2
2.7k
第1回 AWSとGitHub勉強会 - キックオフ -
ogiwarat
0
1.2k
第2回 AWSとGitHub勉強会 - CodespacesとHelidonの利用 -
ogiwarat
0
1.2k
第3回 AWSとGitHub勉強会 - GitHub Actionsを使ったCI環境の構築 -
ogiwarat
0
1.2k
第4回 AWSとGitHub勉強会 - GitHub Actionsを使ったCD環境の構築 -
ogiwarat
0
1.2k
第5回 AWSとGitHub勉強会 - AWS EC2環境の構築 -
ogiwarat
0
1.1k
第6回 AWSとGitHub勉強会 - AWS ECS Fargate環境の構築 -
ogiwarat
0
1.4k
Other Decks in Technology
See All in Technology
現場回帰したデータエンジニアが考える AI 時代のキャリア開発 / Career Development in the Age of AI Perspectives from a Hands-on Data Engineer
medley
0
310
トークンマネジメントでAIにとって働きやすい環境を実現する
hikaruegashira
0
140
8bit CPU 2026
koba789
6
2.6k
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9.4k
FDEの心得
noriakioji
5
6.4k
フィジカルAIの知識ゼロの僕でも AIを使えばここまでできた
tatsuya1970
0
140
【GCC2026】鉄拳8でのVFX開発事例
bandainamcostudios
PRO
0
260
平文パスワードはログに“残り” ── 肝心の侵入は“痕跡すら残らない”
kuroneko13
0
120
ソフトウェアサプライチェーンの構造的リスクとコンテナ環境の保護
kyohmizu
5
840
What's new in Go 1.27?
ciarana
0
300
AI for Science時代を切り開く、政府の次世代HPC戦略の展望
gpuunite_official
0
210
地震情報アプリを作ってみた
yama3133
1
110
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.2k
The Pragmatic Product Professional
lauravandoore
37
7.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Code Reviewing Like a Champion
maltzj
528
40k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
550
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
420
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The Invisible Side of Design
smashingmag
301
52k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Automating Front-end Workflow
addyosmani
1369
210k
Transcript
先取りMaven 4 ~16年ぶりのメジャーアップデート、その進化とは?~ 株式会社 豆蔵 執行役員 主幹ソフトウェアエンジニア 荻原 利雄 2026/5/30
JJUG CCC 2026 Spring
2 荻原 利雄(オギワラ トシオ) • 所属 / 職種 - 株式会社豆蔵
- デジタルアーキテクチャ事業部 - 主幹ソフトウェアエンジニア • プロフィール - オブジェクト指向とともにエンタープライズ なJavaアプリを作りつづけて25年のアラフィ フエンジニア - ここ数年は大規模基幹システムを支える JakartaEEフルスタックなフレームワークや Spring Bootを使ったフロントシステムの開発 を行ってましたが、年貢の納め時で2026年度 からは事業部長をやっています extact-io 豆蔵デベロッパーサイト 豆蔵デベロッパーサイトで色々執筆中! toshio-ogiwara
Agenda 1. Maven4に行く前にMavenのおさらい 2. Maven4におけるブレイクスルー 3. Maven4の新機能 3
本日の説明は • Maven4でこんなことができるようになったよ!の紹介が主な目的となります • なので、依存関係の解決やビルドライフサイクルなどMavenの詳細な仕組みは 説明しません(キチンと説明すると2日間研修コースができます) • 説明はしませんが、サンプルや図解をいれているので雰囲気で理解していただけると思い ます •
スライドの説明に使った完全なサンプルは動作可能な状態で一式GitHubにアッ プしています。違いがわかるようにMaven3とMaven4それぞれの実装を入れてい ます。 4 ←サンプルのアクセスはこちら https://github.com/extact-io/jjug-ccc-2026-spring • なお、サンプルも含め本スライドの 内容は、maven-4.0.0-rc-5をもとに 作成しています。 • GA版では内容が変更なる可能性があり ますので、その点はご留意ください
5 1. Maven4に行く前にMavenのおさらい
Mavenの概要と仕組み 6
7 2. Maven4におけるブレイクスルー
Maven4に込められた思い — Hervé Boutemy (in Javaadvent 2021) 8 どういうこと..?
1つのPOMが抱えていた「2つの矛盾する役割」 9 <project> <groupId>com.mamezou.sample</groupId> <artifactId>maven3-order-parent</artifactId> <version>${revision}${changelist}</version> <packaging>pom</packaging> <properties> <dependencies> <build>
</project> ライブラリを作成・配布する側 ライブラリを利用する側 とはいえ…
「琥珀に閉じ込められた」Mavenとエコシステムの呪縛 10 なにかいい方法はないか、あっ、それだ
ブレイクスルー:用途に応じた「POMの分離」 11 ビルド専用情報と 親POM参照を削ぎ落とす Mavenが生成 このブレイクスルーをもとにこれまで手がつけられなかった課題が改善の実施が可能に!
12 3. Maven4の新機能-Maven3との比較を添えて
1. 公開用POMをきれいにできるようになった 13 Maven3での困りごと order-app/ ├── pom.xml ├── testdata/ │
└── order_test.csv ├── web/ │ └── pom.xml ├── infra/ │ └── pom.xml └── application/ └── pom.xml • ビルドに使うPOMと利用者が依存解決に使うPOMが同じ • ライブラリ利用者に不要なビルド用設定が大量に含まれる <project> <parent> <groupId>com.mamezou.sample</groupId> <artifactId>maven3-order-parent</artifactId> <version>${revision}</version> </parent> <artifactId>order-web</artifactId> <properties> <revision>1.0.0-SNAPSHOT</revision> <openapi.generator.version>7.13.0</openapi.generator.version> </properties> <build> <plugins> <plugin> <artifactId>openapi-generator-maven-plugin</artifactId> ... </plugin> </plugins> </build> </project> ビルド用plugin設定 親POM参照 BOM import 未使用のdependencyManagement ${revision} のようなプロパティ このまま deploy すると、利用者に とって不要な情報まで公開POMに そのまま出ていく たとえば order-web/pom.xml に、ビルド用 の設定が大量に入って、ライブラリの利用者 は見たくない情報が沢山...
1. 公開用POMをきれいにできるようになった 14 Maven4での新機能 • Build POMとConsumer POMが明確に分離 • Cunsumer
POMはBuild POMをフラット化し、親POM参照を解決済みしに、 BOM importも展開した「利用者向け」の綺麗な依存情報にする <project xmlns="http://maven.apache.org/POM/4.1.0"> <modelVersion>4.1.0</modelVersion> <parent> <groupId>com.mamezou.sample</groupId> <artifactId>maven4-order-parent</artifactId> <version>${revision}</version> </parent> <artifactId>order-web</artifactId> <properties> <revision>1.0.0-SNAPSHOT</revision> <openapi.generator.version>7.13.0</openapi.generator.version> </properties> <dependencies> <dependency> <groupId>com.mamezou.sample</groupId> <artifactId>order-application</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>openapi-generator-maven-plugin</artifactId> ... </plugin> </plugins> </build> </project> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.mamezou.sample</groupId> <artifactId>order-web</artifactId> <version>1.0.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.mamezou.sample</groupId> <artifactId>order-application</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> </dependencies> </project> ビルドに使うPOM mvn deploy -Dmaven.consumer.pom.flatten=true デプロイ Build POMから生成 ビルドに必要な情報は削 られてスッキリ
2. ルートディレクトリを安全に参照できるようになった 15 Maven3での困りごと • マルチモジュール構成で、 ${project.basedir}を使うと、Mavenを実行した階層(全体ルート 化か、個別ルート)によって指すディレクトリ位置がずれる。 • 環境依存を排除するための不自然な工夫や回避策が必要だった。
order-app/ ├── pom.xml ├── testdata/ │ └── order_test.csv ├── web/ │ └── pom.xml ├── infra/ │ └── pom.xml └── application/ └── pom.xml ${basedir}/testdata/order_test.csv order-app/application/testdata/order_test.csv application/pom.xml で 実行すると このプロジェクト構成で この定義を すべてのモジュールを一括ビルドする order-app ディレクトリでMavenを実行した場合 と、個別にモジュールをビルドする order-app/application で実行した場合とでディ レクトリの位置がズレる問題があった <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <additionalClasspathElements> <additionalClasspathElement>${project.basedir}/testdata</…> <additionalClasspathElement>${project.basedir}/../testdata</…> </additionalClasspathElements> </configuration> </plugin> <プロジェクト内のリソースを環境依存を排除して定義する工夫の例>
16 Maven4での新機能 • プロジェクトルートを明示する root属性が導入される。 • ルートディレクトリを常に正確に参照するための公式プロパティ <project xmlns="http://maven.apache.org/POM/4.1.0" root="true">
<modelVersion>4.1.0</modelVersion> <groupId>com.mamezou.sample</groupId> <artifactId>maven4-order-parent</artifactId> <version>1.0.0-SNAPSHOT</version> </project> 追加されたプロパティ 2. ルートディレクトリを安全に参照できるようになった ${project.rootDirectory} ${session.topDirectory} ${session.rootDirectory} root属性を定義 <configuration> <additionalClasspathElements> <additionalClasspathElement>${project.rootDirectory}/testdata</…> </additionalClasspathElements> </configuration> 子POMで次のように定義可能 これで order-app から実行しても、 order-app/application から実行し ても、常に次を指せる order-app/testdata/order_test.csv
17 3.マルチモジュールのバージョン記述が減った
18 4. <modules>より意味が分かりやすい<subprojects>が使 えるようになっただけでなくさらに便利に!
19 5. classpath と module-path の扱いを明示できるよう になった <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId>
<version>6.2.0</version> <type>classpath-jar</type> </dependency>
20 6. 失敗したところから安全に再開できるようになった
21 7. ビルドが早くなったー! mnvn install –T 4 じゃダメ
22 8. フェーズがわかりやすくなったー! mnvn install –T 4 じゃダメ
23 ご清聴ありがとうございました