Pivotalは先週Spring IO Platform 1.0のファーストバージョンをリリースした。Spring IO Platformは依存物(とそのバージョン)のリストであり、すべての依存物が一緒に動作する。実装はMavenのPOMファイルであり、自分のプロジェクトにインポートして依存物にバージョンを設定できる。これらの依存物は、Springプロジェクト全体と多くのオープンソースプロジェクトで管理され、利用されている。例えば、次のオープンソースライブラリで使われている。Logback、 Jackson、Guava、JSF、JSTL、JUnit、Derby、Hadoop、Solr、Tomcat、Groovy、EclipseLink JPA、Neo4j、TestNGだ。
Spring IOは究極的には単なるライブラリであり、アプリケーションの
CLASSPATH
に含まれています。ビルドツールの<dependencyManagement/>
を使って特定のバージョンの依存物を選択することができる。バージョンの管理は究極的には提案と利便性であり、要件ではない。Spring IOはJava 1.7と1.8で動作保証されている。しかし、プロジェクトによっては古いJDKでも問題なく動作する。必要なのはJava SEだけでGroovy、Grails、Java EEをサポートする。プラットフォームとしては、組み込みのランタイムに配置することも、従来のアプリケーションサーバにも配置できる。PaaS環境でも利用できる。
このリリースについて詳しく知るため、InfoQはSpring Developer AdvocateであるJosh Long氏に話を聞いた。
InfoQ: このソリューションはどのような問題を解決するのでしょうか。
Spring IOのリリースは私たちが既に提供しているさまざまなフレームワーク/ライブラリについて考えるための論理的な方法になります。また、こららのフレームワークを使うための簡単な方法も提供します。実際には、私たちはSpring IOの部品表のMavenアーティファクトをリリースしたのです。クライアントのMavenビルドにインポートされた依存物として含まれている場合、すべてのSpringプロジェクト(Spring Boot、Spring frameworkなど)の依存物のバージョン、そして、Hibernateのようなサードパーティのエコシステムライブラリを規定します。
シンプルにアーティファクト上で依存物を宣言し(例えば、Spring BootウェブサポートのMavenの'groupId'は 'org.springframework.boot'で、Mavenの'artifactId'は'spring-boot-starter-web'です)、バージョンは廃止します。Spring IO BOMは選択したすべてのライブラリが互いに問題なく動作すること、共通の依存物が同じバージョンに標準化されることを保証します。これによって、プラットフォームのBOM上で最新のMavenのビルド依存物を更新するだけで、最新のライブラリを簡単に利用できるようになります。
例えば、以下の例では、MavenビルドでSpring IO BOMを使っています。
<dependencyManagement> <dependencies> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.0.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>もちろんこれは、ビルドツールの機能です。どんなライブラリのどんなバージョンでも利用できます。Mavenプロパティ('hibernate.version'のような)で共通のライブラリバージョンを定義し、素早くオーバライドできるようにします。
MavenビルドにSpring IO BOMを含めても、定義したすべての依存物をロードすることにはならない。代わりに、バージョン番号を明示するのに使われる。バージョン番号をオーバライドすることも、依存物を除外することもできる。Springのバージョンをオーバライドするには、<spring.version>プロパティを定義する。依存物を除外するには、通常と同じように依存物を追加すれば除外してくれる(またはMaven 3のワイルドカードを使った除外の仕組みも使える)。
さらに詳しくこの仕組みを理解するには、CXFとSpringを使ったApache Camelプロジェクトを見るのがいいだろう。Spring IO BOMをインポートして、依存物のバージョンを取り除き、バージョンを定義しているプロパティを削除している。管理対象ではない依存物(Apache CamelとCXF)にはバージョンを定義しておく必要がある。下のgistは、pom.xmlがどのように変わるかを示している。Apache Camel 2.14-SNAPSHOTはpull request 199を統合すればSpring 4で動作する。
Redditでの反応はさまざまだ。Springのスタックがなければ、Grailsに似ているとコメントする人もいる。歓迎するコメントもある。XMLを必要としないので、Spring 4と相性がいい、と考える人もいる。Springを批判する陣営は代替としてJava EEを薦めているようだ。
PivotalのP.O.V.ブログでは、今回のリリースを"Javaのコンシュマライゼーション"と呼んでいる。GoPivotalブログのマネージングエディタであるStacy Schneider氏はこの動きをAppleがハードウェアの世界で起こした動きと比べている。氏は、有名なSteve Jobs氏の発言を引用している。
"Appleは統合されたモデルを目指します。ユーザがシステムインテグレータにならなくて済むようにするためです。"
氏は、Spring IO Platform 1.0を使うことの利点を列挙している。
- テストがシンプルになること。ベースラインダウンロードにはすでに動作が保証されているモジュールとバージョンが含まれている。
- 構成が簡単。互換性を確かめるための時間が必要なくなる。
- 柔軟性。開発者は軽量な手法の場合に必要ものを利用できる。アプリに必要なSpring IO Platformの部分だけを使えばいい。
- 一定のリリースサイクル。Spring IO Platformは半年に1回のリリースで、リリースサイクルを予測できる。
Schneider氏は今回のリリースには、従来はSpringプロジェクトのコアではないと思われていたモジュールも追加されている、という。特にアプリケーション向けのドメイン特化ランタイム(DSR)だ。DSRはスタンドアロンで動作し、外部のコンテナに配置する必要がない。現時点では、3つのDSRがある。Spring XD、Spring Boot、Grailsだ。Spring XDはGAになった時点でSpring IO Platformに含まれる。