金曜日 8 22, 2008
金曜日 8 22, 2008
Prelude も含めて、GlassFish v3 の多言語版を出すのには、OSGi の Fragment Bundle の機能が使えるととても嬉しい。 基本的に、OSGi バンドルの A があるとして、そのマニフェスト中で、Bundle-Classpath: B というような定義をしておくことで、A で B のクラスやリソースがロードされるようになりますが、フラグメントバンドルを使うと、B (これがフラグメント) の側に「ホストが A」と記述しておけば、A が解決される際にプラットフォームが B を追加してくれます。A の側には特に変更は要りません。(詳しくは仕様の 3.14 節に。)
そもそも、フラグメントバンドルは、翻訳ファイルなどのリソースを、メインのアプリと別に準備、リリースしたりする用途を想定しているみたいですね。Prelude の多言語版を出すにあたって、Prelude が使う OSGi 実装 Felix でこれが使えないのはイタイなぁという状況でした。なので、l10n チームは先日アクエリアムの記事にも出ていた Richard さんに、ぜひインプリしてくれーとお願いしていたのでした。
で、Felix のトランクに入った!ので (Richard さん、ありがとー)、早速試しました。
なんでも良かったのですが、org.glassfish.core.kernel の疑似ローカリゼーションのバンドルを作ります。基本的には昔のエントリのやり方ですが、今回は、ただの jar でなく、hk2-jar で、かつ、OSGi のマニフェストを作ってくれる maven-bundle-plugin を使います。<plugins> の中に下記を追加しました。
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<!-- Enable the plugin for hk2-jar packaging type -->
<supportedProjectTypes>
<supportedProjectType>hk2-jar</supportedProjectType>
<supportedProjectType>jar</supportedProjectType>
<supportedProjectType>bundle</supportedProjectType>
</supportedProjectTypes>
<instructions>
<!-- _include does not work. See Felix-620.
<_include>osgi.bundle</_include>
-->
<Export-Package>
com.sun.enterprise.admin
</Export-Package>
<Fragment-Host>
org.glassfish.core.kernel
</Fragment-Host>
</instructions>
</configuration>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.sun.enterprise</groupId>
<artifactId>hk2-maven-plugin</artifactId>
<version>${hk2.plugin.version}</version>
<configuration>
<archive>
<!-- Use the manifest.mf produced by maven-bundle-plugin;manifest -->
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
maven-bundle-plugin の <instructions> 内に、Fragment-Host を追加しているのがポイントで、これによって、バンドルフラグメントとしての接続先を指定している。
あとは、これをビルドすると kernel-l10n-10.0-SNAPSHOT.jar ができる。これで、フラグメントバンドルのはず。
さて、このフラグメントを試すためには、今の v3 が使っている Felix では先の修正が入っていないので、トランクのビルドをとってきて使う。
% mv ${glassfish_home}/felix/bin/felix.jar ${glassfish_home}/felix/bin/felix.jar.orig
% cp org.apache.felix.main-1.1.0-20080821.005457-2.jar ${glassfish_home}/felix/bin/felix.jar
% cp launcher-l10n-10.0-SNAPSHOT.jar ${glassfish_home}/modules
OSGi のレベルで情報を見たいので、Felix shell を使いつつ v3 を起動します。glassfish/felix/conf/config.properties の felix.auto.start.1 プロパティに 下記のように jar を 2 つ追加します。(最後の 2 行が追加分)
felix.auto.start.1= \
${com.sun.aas.installRootURI}/modules/tiger-types-osgi-0.3.8.jar \
${com.sun.aas.installRootURI}/modules/auto-depends-0.3.8.jar \
${com.sun.aas.installRootURI}/modules/config-0.3.8.jar \
${com.sun.aas.installRootURI}/modules/hk2-core-0.3.8.jar \
${com.sun.aas.installRootURI}/modules/osgi-adapter-0.3.8.jar \
${com.sun.aas.installRootURI}/felix/bundle/org.apache.felix.shell.jar \
${com.sun.aas.installRootURI}/felix/bundle/org.apache.felix.shell.tui.jar
で、asadmin ではなく、以下のように起動。
% java -jar modules/glassfish-10.0-V3-PRELUDE-M1-SNAPSHOT.jar : : 省略 : Aug 22, 2008 5:54:35 PM com.sun.enterprise.glassfish.bootstrap.ASMainFelix launchOSGiFW INFO: Framework successfully started Aug 22, 2008 5:54:35 PM INFO: ->
この状態で、Felix shell が使えて、help と入力すると ps でインストールされているバンドルを確認できることがわかるので、
情報: ->
ps
2008/08/22 20:32:25
情報: START LEVEL 1
2008/08/22 20:32:25
情報: ID State Level Name
2008/08/22 20:32:25
情報: [ 0] [Active ] [ 0] System Bundle (1.1.0.SNAPSHOT)
:
:
2008/08/22 20:32:25
情報: [ 15] [Resolved ] [ 1] Kernel Classes localization (10.0.0.V3-PRELUDE-M1-SNAPSHOT)
:
:
2008/08/22 20:32:27
情報: [ 88] [Active ] [ 1] Kernel Classes (10.0.0.V3-PRELUDE-M1-SNAPSHOT)
:
:
2008/08/22 20:32:27
情報: ->
お!ちゃんと解決されている。今までのバージョンの Felix だと、状態が Installed のままだったので、嬉しい。
なんですが、なぜか _ja のリソースバンドルがロードされないんですよね。というわけで、完全に自分のメモなんですが、続きは、後日、解決したら。