ogino's blog
Archives
« 11月 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     
       
Today
Click me to subscribe
Search

Links
 

Today's Page Hits: 37

« v3 Prelude で Rails | Main | Felix に Fragment... »
金曜日 8 22, 2008
Felix に Fragment Bundle サポート、v3 で実験。

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 のリソースバンドルがロードされないんですよね。というわけで、完全に自分のメモなんですが、続きは、後日、解決したら。

Posted at 09:47午後 8 22, 2008 by Shinya Ogino in Sun  |  Comments[0]

Comments:

Post a Comment:
  • HTML Syntax: NOT allowed