ポートレットの作り方 (Jetspeed 2 編)

Jetspeed 2 は、Java Portlet Specification 1.0 (JSR-168) および 2.0 (JSR-286) に対応したポートレットコンテナ。


[2010-11-30 追記] しまった! 以下の手順はあんまり正しくないみたいだ! ここは俺が食い止める! お前はその間に公式サイトのチュートリアルに逃げるんだ!!

環境を構築する

  1. Eclipse IDE for Java EE Developers を入れる。今回は 3.6.1 (Helios SR1) を入れた。
    • eclipse.ini で -vm オプションを使って、JRE じゃなくて JDK で起動するように設定する (Maven を使うために必要)。
  2. Pleiades を入れる。今回は 1.3.3 を入れた。
  3. Eclipse を起動して m2eclipse プラグインを入れる。今回は 0.12.0 を入れた。
  4. もうひとつ、「WTPMaven 統合」プラグインを入れる。今回は 0.11.0 を入れた (m2eclipse 本体とバージョンが合ってないけど大丈夫だろうか……?)。
  5. Apache Jetspeed 2 を入れる。GUIインストーラで普通にインストールすると Tomcat も一緒に入る (バージョンはちょっと古め)。
  6. Eclipse の設定で、「サーバー」→「ランタイム環境」を開き、「Apache Tomcat v6.0」を選択。どこにインストールされているか聞かれるので、Jetspeed 2 のインストール先を指定する。
  7. Eclipse の「サーバー」ビューを開いて、Jetspeed 2 を追加する。
    • 登録したら、「サーバー」ビューでダブルクリックして、「サーバー・ロケーション」を「Tomcat インストールを使用」に変更して保存する (デフォルトだと、webapps 配下にすでに配備されているアプリが無視される。Jetspeed 2 本体も webapps 配下にいるので、無視されないように変更する必要がある)。
  8. 試しに Eclipse 上から起動してみる。ブラウザで http://localhost:8080 を開き、ポータルが表示されれば OK。
    • 管理者アカウント (admin/admin) でログインしてみるのもいいね。

ポートレットを新規作成する

  1. 新規プロジェクトを作る。Maven Project を選択し、アーキタイプは以下を選択する。
  2. pom.xml を開いて必要な設定を追加する。とくに、使用する Java のバージョン (後述)。
    • デフォルトのままだと J2SE5 になってしまっているため。
  3. pom.xml を上書き保存したら、プロジェクトを右クリックして「Maven」→「プロジェクト構成の更新」を選択する。
    • プロジェクトにぶら下がっている「JRE システム・ライブラリー」の右端に、薄い字で「JavaSE-1.6」と出てれば OK。
  4. プロジェクトの設定で「Maven」を開いて、「アクティブ Maven プロファイル」のところに jetspeed と入れる。
    • これ以降、src/main/webapps/WEB-INF/web.xml じゃなくて src/main/jetspeed/web.xml が使われるようになる。
    • src/main/webapps/WEB-INF/web.xml にあるのは Jetspeed 2 じゃなくて Pluto 用のやつなので、そのままだと Jetspeed 2 で動かせないため。「web.xml の場所を変えるなんて、後で修正するときに間違えそう><」という場合は、Maven の設定を変えるのではなくて src/main/jetspeed/web.xml を src/main/jetspeed/web.xml に上書きしても OK。
  5. src/main/jetspeed/web.xml を編集する。サーブレットがひとつ登録されているが、なぜか servlet 要素と servlet-mapping で名前が一致していないので、どっちかに合わせる (後述)。
    • Maven の設定を変えても web.xml が切り替わらない場合は、一旦プロジェクトを閉じて開きなおせば反映される。
  6. src/main/webapps/WEB-INF/portlet.xml を編集する。
    • プロジェクト作成時に指定したパッケージに、MyPortlet という名前のクラスが生成されているはずだが、portlet.xml にはそのクラス名をちゃんと書いてくれないみたいなので手動で修正する。具体的には、portlet-class 要素に MyPortlet の完全修飾クラス名 (my.example.MyPortlet とか) を書く。
  7. 「サーバー」ビューで先ほど登録したサーバを右クリックして「追加と除去」を選択し、上記で作成したプロジェクトを追加する。
  8. Jetspeed 2 を再起動する (←不要?)。
  9. ブラウザで Jetspeed 2 (http://localhost:8080) を開いて、適当なユーザでログインする。
  10. ページ右側の "Jetspeed Toolbox" で、ポートレットを検索し、ページに追加 (Add) してみる。
    • portlet.xml の display-name 要素に書いた名前で検索すると出てくる。
  11. "Put the portlet title here" というタイトルのポートレットがページに追加される。
    • タイトルの下に "Welcome to the Maven 2 World" と表示されていれば OK。
    • "This portlet is not available" (←うろ覚え) みたいなメッセージが出ている場合は、うまく動いてない。

pom.xml に行った修正

上記の手順で、pom.xml を修正した箇所がこちら。Java 1.6 を使いますよという設定を追加した。

  		<plugin>
  			<groupId>org.apache.maven.plugins</groupId>
  			<artifactId>maven-compiler-plugin</artifactId>
  			<version>2.3.2</version>
  			<configuration>
  				<source>1.6</source>
  				<target>1.6</target>
  			</configuration>
  		</plugin>

src/main/jetspeed/web.xml に行った修正

Jetspeed 2 の配備ツールを使うと、Jetspeed 2 で動かすために必要な設定を web.xml に追加してから配備してくれるらしい。Eclipse から直接起動する場合は配備ツールを使わないので、必要な設定をあらかじめ web.xml に足しておく。

  • servlet-mapping の servlet-name に書かれていた JetspeedContainer をコピって、servlet 配下の servlet-name と display-name に貼り付けた。
  • Maven で生成された内容と、公式サイトで配備ツールの説明ページに書いてある内容が微妙に違うので、公式サイトに合わせるために、contextName のところと load-on-startup の行を追加した。contextName の値には何を指定すればいいのかわからないので、とりあえず、portlet.xmlportlet-name 要素に書いてあるのと同じ値を指定した (今回の場合は hello-portlet-jetspeed2)。
    <servlet>
        <servlet-name>JetspeedContainer</servlet-name>
        <display-name>JetspeedContainer</display-name>
        <description>Portlet for Jetspeed Fusion</description>
        <servlet-class>org.apache.jetspeed.container.JetspeedContainerServlet</servlet-class>

        <init-param>
            <param-name>contextName</param-name>
            <param-value>hello-portlet-jetspeed2</param-value>
        </init-param>

        <init-param>
            <param-name>registerAtInit</param-name>
            <param-value>1</param-value>
        </init-param>

        <init-param>
            <param-name>portletApplication</param-name>
            <param-value>hello-portlet-jetspeed2</param-value>
        </init-param>

        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>JetspeedContainer</servlet-name>
        <url-pattern>/container/*</url-pattern>
    </servlet-mapping>