CLOVER🍀

That was when it all began.

MavenとSTSでOSGi Web Bundleプロジェクトを作成する

サンプルアプリケーション「GreenPages」をいろいろ見てきましたので、次はいよいよ自分でBundleを作ってみよう!という気だったのですが、ここで思わぬ障壁が…。

障壁になっているのは、ズバリSpringSource Tool Suite(STS)です…。お前、Spring関連のプログラミングを容易にするツールじゃないんかぃ、と。

ぶっちゃけ、ここでかなり心が折れそうになりました…。

作成しようとする新しいプロジェクトの性格は、「OSGi Bundle」かつ「Spring MVCを使ったWebアプリケーション」です。まあ、GreenPagesのWebモジュールの自作版ってことですね。

STSでプロジェクトを作成する際に、上記条件を満たせそうなプロジェクトはパッと見て以下の3つです。

  • Bundle Project
  • Shared Service WAR Project
  • Spring MVC Project

が、どれも使いものになりません。

まずBundle Project。一応、OSGi Bundle作成用のプロジェクトらしいのですが、これを使ってプロジェクト作成のステップを進めると、途中でModule TypeでWebを選択できたり、Target RuntimeにVirgo Web Serverを指定できたり、Web-ContextPathを設定できたりするのであっさりできるのかなーと思っていたのですが、いざできた結果はこれです。

…MANIFEST.MFしかありませんが?pom.xmlはおろか、WEB-INFもございませんが?これだと意味無いんですけど。

仕方がないので、次はShared Service WAR Projectでやってみると…ディレクトリ構成は比較的近いのですが、依存関係の定義が微妙で、OSGi Bundle作成用とSpring MVC用が中途半端に混じった感じになっています。Spring Web Flowなんて入ってるし。さらに極めつけは、pom.xmlに書かれているSpringのバージョンが2.5.6.Aだということです。え〜と、今のSpringのバージョンは3.0ですよね?

なら最後、Spring MVC Project。これはこれで若干微妙なディレクトリ構成ですがまあ比較的許容範囲。が、pom.xmlの内容がOSGi Bundleとしては使えなくて、結局ほとんど書き直すことになるのでこれも却下。

なんだかなー。まあ、Spring MVC Projectがそのまま使えないのはいいとして、他2つ、特にBundle Projectのサポートが冷たいのなんのって…。SpringSource、OSGiにやる気ないのかなぁ…?

仕方がないので、MavenのWeb用プロジェクトから作ることにしました。ちょっと道を外れている気もしますけど、どうせ勉強も兼ねているのでいっかぁ、と。

まずは、MavenでWeb用プロジェクトを作成。BundleにしてるのにSNAPSHOTとか付いてもあんまり嬉しくないので、バージョンは「1.0.0」にしておきました。

$ mvn archetype:generate -DgroupId=my.web.bundle -DartifactId=my-web-bundle -DarchetypeArtifactId=maven-archetype-webapp
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom <<<
[INFO] 
[INFO] --- maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Using property: groupId = my.web.bundle
[INFO] Using property: artifactId = my-web-bundle
Define value for property 'version':  1.0-SNAPSHOT: : 1.0.0
[INFO] Using property: package = my.web.bundle
Confirm properties configuration:
groupId: my.web.bundle
artifactId: my-web-bundle
version: 1.0.0
package: my.web.bundle
 Y: : 
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: my.web.bundle
[INFO] Parameter: packageName, Value: my.web.bundle
[INFO] Parameter: package, Value: my.web.bundle
[INFO] Parameter: artifactId, Value: my-web-bundle
[INFO] Parameter: basedir, Value: /xxxxx/springsource/workspace-sts-2.6.1.RELEASE
[INFO] Parameter: version, Value: 1.0.0
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] project created from Old (1.x) Archetype in dir: /xxxxx/springsource/workspace-sts-2.6.1.RELEASE/my-web-bundle
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.066s
[INFO] Finished at: Wed May 25 21:15:49 JST 2011
[INFO] Final Memory: 8M/105M
[INFO] ------------------------------------------------------------------------

続いて、MavenプロジェクトをEclipseに取り込めるようにします。

$ cd my-web-bundle/
$ mvn eclipse:eclipse
[INFO] Scanning for projects...
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/maven-metadata.xml
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/maven-metadata.xml (680 B at 1.0 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/2.8/maven-eclipse-plugin-2.8.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/2.8/maven-eclipse-plugin-2.8.pom (12 KB at 23.3 KB/sec)
… 省略 …
[INFO] Using Eclipse Workspace: /xxxxx/springsource/workspace-sts-2.6.1.RELEASE
[INFO] no substring wtp server match.
[INFO] Using as WTP server : VMware vFabric tc Server Developer Edition (Runtime) v2.5
[INFO] Adding default classpath container: org.eclipse.jdt.launching.JRE_CONTAINER
[INFO] Not writing settings - defaults suffice
[INFO] Wrote Eclipse project for "my-web-bundle" to /xxxxx/springsource/workspace-sts-2.6.1.RELEASE/my-web-bundle.
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.843s
[INFO] Finished at: Wed May 25 21:17:56 JST 2011
[INFO] Final Memory: 7M/105M
[INFO] ------------------------------------------------------------------------

できたら、STSからインポートします。「Package Explorer」から右クリックで「Import」を選択、Importメニューでは「General」→「Existing Projects into Workspace」を選んでください。取り込みたいプロジェクトを選択して、Finish!

が、当然これだけでは足りません。依存関係はMavenで管理した方がよさそうですし、OSGi Bundleにもなってませんからね。

あと、毎度ですがJavaソースコード用のディレクトリがないので、自分で作ってビルドパスに追加してくださいね。

まずは、Mavenでの依存関係管理を有効にします。プロジェクトを右クリックして、「Maven」→「Enable Dependency Management」を選択してください。プロジェクトの直下に、「Maven Dependencies」が現れます。

続いて、OSGi Projectへ。プロジェクトを右クリックして、「Spring Tools」→「Add OSGi Bundle Project Nature」を選択。それから、ランタイムの設定。プロジェクトを右クリックして、「Properties」を選択。立ち上がってきたメニューから、「Targeted Runtimes」を選び、Virgo Web Server(Runtime) v2.1にチェックを入れます。

pom.xmlの修正。greenpages.webから、maven-war-pluginの設定を引っ張っておきます。

  <!--
  <build>
    <finalName>my-web-bundle</finalName>
  </build>
  -->
	<build>
	<plugins>
		<plugin>
			<artifactId>maven-war-plugin</artifactId>
			<version>2.1-beta-1</version>
			<configuration>
				<packagingExcludes>WEB-INF/lib/**</packagingExcludes>
			</configuration>
		</plugin>
	</plugins>
	</build>

OSGi Bundleとしてデプロイ可能にするために、MANIFEST.MFを修正。

Manifest-Version: 1.0
Bundle-SymbolicName: my.web.bundle
Bundle-Version: 1.0.0
Bundle-Name: My Web Bundle
Web-ContextPath: my-web-bundle

Webコンテキストパスは、「my-web-bundle」になります。

ここまでやったら、ServersタブのVirge Web Serverを右クリックして「Add and Remove」を選び、作成したプロジェクトを追加してVirgo Web Serverを起動します。

この手順で作成した場合、以下のURLにアクセスして「Hello World!」と表示されれば成功です。
http://localhost:8080/my-web-bundle/index.jsp

これで最初のOSGI Web Bundleができましたね。VirgoのAdmin Consoleでも見えるようになりましたよ。