Upgrade to Pro — share decks privately, control downloads, hide ads and more …

先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~

Avatar for 荻原利雄

荻原利雄

May 31, 2026

More Decks by 荻原利雄

Other Decks in Technology

Transcript

  1. 2 荻原 利雄(オギワラ トシオ) • 所属 / 職種 - 株式会社豆蔵

    - デジタルアーキテクチャ事業部 - 主幹ソフトウェアエンジニア • プロフィール - オブジェクト指向とともにエンタープライズ なJavaアプリを作りつづけて25年のアラフィ フエンジニア - ここ数年は大規模基幹システムを支える JakartaEEフルスタックなフレームワークや Spring Bootを使ったフロントシステムの開発 を行ってましたが、年貢の納め時で2026年度 からは事業部長をやっています extact-io 豆蔵デベロッパーサイト 豆蔵デベロッパーサイトで色々執筆中! toshio-ogiwara
  2. 本日の説明は • Maven4でこんなことができるようになったよ!の紹介が主な目的となります • なので、依存関係の解決やビルドライフサイクルなどMavenの詳細な仕組みは 説明しません(キチンと説明すると2日間研修コースができます) • 説明はしませんが、サンプルや図解をいれているので雰囲気で理解していただけると思い ます •

    スライドの説明に使った完全なサンプルは動作可能な状態で一式GitHubにアッ プしています。違いがわかるようにMaven3とMaven4それぞれの実装を入れてい ます。 4 ←サンプルのアクセスはこちら https://github.com/extact-io/jjug-ccc-2026-spring • なお、サンプルも含め本スライドの 内容は、maven-4.0.0-rc-5をもとに 作成しています。 • GA版では内容が変更なる可能性があり ますので、その点はご留意ください
  3. 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 に、ビルド用 の設定が大量に入って、ライブラリの利用者 は見たくない情報が沢山...
  4. 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から生成 ビルドに必要な情報は削 られてスッキリ
  5. 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> <プロジェクト内のリソースを環境依存を排除して定義する工夫の例>
  6. 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