目次


Bluemix 上で稼動する Web アプリケーション開発方法 - Java 編

Comments

1. はじめに

Bluemix 上のランタイム「Liberty for Java」を利用して Web アプリケーションを開発する手順をステップ・バイ・ステップで解説します。

Eclipse を利用した開発環境の準備 (Bluemix Plugin の導入、Liberty サーバー/Bluemix サーバーの作成)、アプリケーションの開発、ローカルでのテスト、Bluemix へのデプロイのそれぞれについて解説します。また、Cloudant のサービスを追加し、作成したアプリケーションにどのように組み込んでいくかについても解説します。

当記事で開発するアプリケーションは、Web 上でメモを管理するアプリケーションで、データを Cloudant に格納します。コードは、JazzHub で公開していますので、ぜひアプリケーション開発の参考としてご参照ください。

2. 前提環境

当記事では以下の環境を前提としています。

  • Windows 7
  • Eclipse Java EE IDE for Web Developers. (Luna)
  • Java 7

    : Bluemix へのデプロイに必要な Eclipse のプラグインの "IBM Eclipse Tools for Bluemix" に、Java 7 が必要です。

3. 環境準備

はじめに、環境準備に必要となる Eclipse のプラグインについてご紹介します。

  • IBM Eclipse Tools for Bluemix

    Eclipse から Bluemix へ Web アプリケーションや Liberty サーバーをデプロイするには、Eclipse のプラグインである "IBM Eclipse Tools for Bluemix" が必要です。本章では、Eclipse Marketplace から導入し、Bluemix へのデプロイに必要な構成を実施する手順 (Bluemix サーバー作成) を記載します。

  • WebSphere Application Server Developer Tools

    Liberty サーバーの作成、構成には、"WebSphere Application Server Developer Tools" が必要となります。"IBM Eclipse Tools for Bluemix" の導入時に自動的に導入されます。

以下の章に環境準備の手順を記載します。

3.1. IBM Eclipse Tools for Bluemix の導入

IBM Eclipse Tools for Bluemix を導入します。

  1. IBM Eclipse Tools for Bluemix は、Java 7 を前提環境としているため、Eclipse が Java 7 で起動するように、eclipse.ini に以下を設定
    -vm <Java 7のインストールディレクトリ>/jre/bin/javaw.exe
  2. Eclipse を起動
  3. Eclipse Marketplace から IBM Eclipse Tools for Bluemix を導入

    補足: "Eclipse Marketplace > Installed タブ" に、" IBM Eclipse Tools for Bluemix Beta" なども表示されることがあります。"Installed タブ" では正確な情報が表示されないことがあるため、導入確認は、" Help > Installation Details" で実施してください。

3.2. Bluemix サーバー作成

Bluemix に Web アプリケーションや Liberty サーバーをデプロイするために必要となるサーバー構成を、Eclipse に作成します。

  1. Server ビューを右クリックする
  2. New > Server をクリックする
  3. server type: IBM Bluemix を選択し、Next をクリックする
  4. Account Information を入力後、Validate Account をクリックし、エラーしないことを確認し、Next をクリックする
  5. Organizations and Spaces を選択し、Finish をクリックする
  6. Add and Remove では、Bluemix にデプロイするアプリケーションや Liberty サーバーを選択できるが、まだそれらを作成していないため、デフォルトのまま Finish をクリックする
  7. Server ビューに、IBM Bluemix が表示されることを確認する

3.3. Liberty サーバー作成

ローカル環境でのテストのために、Liberty サーバーを作成します。今回は、Beta 版である Liberty Profile Beta Runtime を使用します。「5. アプリケーション開発 (Cloudant 連携)」セクションで作成する Cloudant を使用するアプリケーションで、Liberty の Beta 機能である CouchDB Client Driver Connector (couchdb-1.0) を利用するためです。 (2014/9 時点)

  1. Server ビューを右クリックする
  2. New > Server をクリックする
  3. server type: WebSphere Application Server Liberty Profile を選択し、Next をクリックする
  4. Installation folder : New Directory を選択する
  5. Path: Liberty を導入するディレクトリを入力する
  6. Next をクリックする
  7. Download and install a new runtime environment from: Liberty Profile Beta Runtime を選択する
  8. Next をクリックする
  9. Install Add-ons 画面で、Liberty Profile Beta Extended Package の Install をクリックする
  10. Next をクリックする
  11. License Acceptance 画面で、同意を選択、Next をクリックする
  12. New Liberty Profile Server 画面は、デフォルトのまま Next をクリックする
  13. Add and Remove 画面は、デフォルトのまま Finish をクリックする
  14. Server ビューに、WebSphere Application Server Liberty Profile が表示されることを確認する

4. アプリケーション開発 (単純な JSP ファイルを持つアプリケーション)

この章では、Liberty サーバーのシステムプロパティを表示する単純な JSP ファイルを持つ Web アプリケーションを例に、開発、デプロイ、テスト (ローカル、Bluemix) の方法をご紹介します。

  • 開発する Web アプリケーション

    Liberty サーバーでは、「インストールディレクトリ/usr/servers/サーバー名/jvm.options」にシステムプロパティを設定できます。今回はテスト用に、システムプロパティを設定し、JSP ファイルに表示させます。

  • Eclipse から Bluemix へのデプロイ方法

    Eclipse から Bluemix へアプリケーションをデプロイ方法は 2 種類あります。

    • Web アプリケーションをデプロイ
    • Liberty サーバーをデプロイ (<Liberty インストールディレクトリ>/usr 配下)

      補足: cf ツールを使ったデプロイ方法は以下を参照

今回のアプリケーションでは、"Web アプリケーションをデプロイ" した場合には、テスト用のプロパティの値は null となり、"Liberty サーバーをデプロイ" した場合には jvm.options も Bluemix へデプロイされるため値が表示されます。本章では 2 つの Bluemix へのデプロイ方法を実施します。

以下に各手順を記載します。

4.1. テスト用システムプロパティを Liberty サーバーへ設定

ローカル環境でのテストのため、テスト用システムプロパティを Liberty サーバーへ設定します。

  1. "<Liberty インストールディレクトリ>/usr/servers/<サーバー名>" 以下に jvm.options ファイルを作成する。
  2. jvm.options ファイルに以下の設定を入力する。
    -Dtestproperty=testproperty_value

4.2. Eclipse での開発

  1. Dynamic Web Project を作成する。
    • File > New > Dynamic Web Project
    • Project name: SimpleApp
    • Target Runtime: WebSphere Application Server Liberty Profile
    • Dynamic web module version: 3.0
    • その他、デフォルト設定で Finish をクリック
  2. テキストファイルのエンコーディングを UTF-8 に設定する。
  3. JPS ファイルを作成する。
    • Project Explorer ビュー > SimpleApp を右クリック
    • New > JSP file
    • File name: index.jsp
    • その他はデフォルト設定で Finish をクリック
    • index.jsp を開き、以下のようにコーディングし、保存
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>index</title>
      </head>
      <body>
      システムプロパティ:jvm.options:testproperty=<%= System.getProperty("testproperty") %><br>
      </body>
      </html>

4.3. ローカルでのテスト

作成したアプリケーション (SimpleApp) をローカルの Liberty サーバーにデプロイしてテストします。ローカルの Liberty サーバーにはテスト用のシステムプロパティ (testproperty) が設定されているため、値が表示されます。

  1. Liberty サーバーに SimpleApp をデプロイする。
    • Project Explorer ビュー > SimpleApp を右クリック
    • Run as > Run on Server
    • Server: WebSphere Application Server Liberty Profile
    • Finish をクリック
  2. SimpleApp にアクセスする。

4.4. Bluemix でのテスト

SimpleApp を以下の 2 つの方法でデプロイし、それぞれテストします。

  • Web アプリケーションをデプロイ
  • Liberty サーバーをデプロイ (<Liberty インストールディレクトリ>/usr 配下)

4.4.1. Web アプリケーションをデプロイ

Web アプリケーションをデプロイする方法では、Bluemix の Liberty サーバーにテスト用のシステムプロパティ (testproperty) が設定されていないため、SimpleApp にアクセスすると、値は表示されません。

  1. Bluemix に SimpleApp をデプロイする。
    • Server ビュー > IBM Bluemix を選択し、右クリックし、Add and Remote をクリック
    • SimpleApp を選択し、Add をクリックして Finish をクリック
    • Save to manifest file をチェックし、Next をクリック

      補足: Save to manifest file をチェックすると、デプロイ時の情報を示す manifest.yml がプロジェクト直下に作成される。

    • Subdomain: Bluemix 上で一意になるように任意の名前を入力
    • "Services selection" では Bluemix のサービスを追加、バインドすることができる。本章ではサービスを利用しないため、デフォルトのまま Next をクリック (後続のアプリケーション開発 (Cloudant 連携) の章で、サービス利用について紹介)
    • "Environment Variables" では Bluemix の環境変数を設定することができる。本章では環境変数を使用しないため、デフォルトのまま Finish をクリック (後続のアプリケーション開発 (Cloudant 連携) の章で、環境変数の利用について紹介)
  2. SimpleApp が Bluemix にデプロイされたことを確認する。
  3. SimpleApp にアクセスする。

    URL は 2) の補足に記載した Applications 画面の General > Mapped URLs で確認できます。

  4. Bluemix の Liberty サーバーの jvm.options の内容を確認する。
    • Server ビュー > IBM Bluemix > SimpleApp をダブルクリック
    • Remote Systems View をクリック (このビューで Bluemix 上のファイルを参照することができる)
    • Remoete Systems View > IBM > Bluemix > Applications and Files > Accounts > IBM Bluemix > SimpleApp#0 > app > .liberty > usr > servers > "Liberty サーバー名" > jvm.options をダブルクリック

      補足: SimpleApp#0 の#0 はインスタンス番号です。SimpleApp のインスタンスを増やすと、SimpleApp#1,2・・・が表示されます。

    • Bluemix 上の Liberty サーバーの jvm.options には、ローカルで設定したテスト用システムプロパティ (testproperty) はありません

4.4.2. Liberty サーバーをデプロイ

Liberty サーバーをデプロイする方法では、<Liberty インストールディレクトリ>/usr 配下ごと、Bluemix にデプロイします。Bluemix の Liberty サーバーにテスト用のシステムプロパティ (testproperty) が設定された jvm.options が使用されるため、SimpleApp にアクセスすると、値が表示されます。

  1. ローカルの Liberty サーバーを停止する。
  2. Bluemix に Liberty サーバーをデプロイする。
  3. SimpleApp-LibertyServer が Bluemix にデプロイされたことを確認する。
  4. SimpleApp-LibertyServer にアクセスする。

    Liberty サーバーごとデプロイした場合は、コンテキストルートが残っているため、アクセスする URL は、Mapped URLs にコンテキストルートを加えます。

    • URL: http://<Subdomain.Domain>/SimpleApp/
    • 下記のように、テスト用システムプロパティの値が表示されます。
    • コンテキストルートがあります。

      補足: Web アプリケーションをデプロイした場合には、値は null、コンテキストルートはありませんでした。

  5. Bluemix の Liberty サーバーの jvm.options の内容を確認する。
    • Server ビュー > IBM Bluemix > SimpleApp-LibertyServer をダブルクリック
    • Remote Systems View をダブルクリック
    • Remote Systems View で、IBM/Bluemix/Applications and Files/Accounts/IBM Bluemix/Simple-App-LibertyServer#0/app/wlp/usr/servers/defaultServer/ jvm.options をダブルクリック

      : Web アプリケーションをデプロイした場合とパスが異なります。

      • Web アプリケーション: app/.liberty/usr
      • Liberty サーバー: app/wlp/usr
    • Bluemix 上の Liberty サーバーの jvm.options に、ローカルで設定したテスト用システムプロパティ (testproperty) が含まれることがわかります。

4.5. まとめ

Liberty サーバーのシステムプロパティを表示する単純な Web アプリケーションを例に、Bluemix に Web アプリケーションを開発、デプロイ、テストする方法を紹介しました。

Bluemix へのデプロイ方法は、2 つの方法があります。

  • Web アプリケーションをデプロイ
  • Liberty サーバーをデプロイ (<Liberty インストールディレクトリ>/usr 配下)

Bluemix 上の Liberty サーバーのサーバー構成をカスタマイズしたい場合 (システムプロパティの設定、Java ヒープサイズの変更など) には、Liberty サーバーをデプロイする方法をご検討ください。

次章では、Bluemix の Data Management サービスである "Cloudant" を利用するアプリケーションの開発、デプロイ、テストについてご紹介します。

5. アプリケーション開発 (Cloudant 連携)

この章では、Cloudant を利用する Web アプリケーションの開発、デプロイ、テスト (Bluemix、ローカル) の方法を紹介します。

  • 開発する Web アプリケーション

    Web 上でメモを管理するアプリケーションで、データを Cloudant に格納します。アプリケーションには、メモの参照、作成、更新、削除の機能を実装します。

    [アプリケーションのコードを入手する (https://hub.jazz.net/project/isebm/memoAppJava/overview)]

  • Cloudant

    Cloudant は、Bluemix 上の NoSQL データベースで、JSON 形式のデータを処理することができます。

  • Java から Cloudant を利用するための API – Ektorp

    Java から Cloudant を利用するための API に、ektorp client library があります。Bluemix で、Liberty のアプリケーションに Cloudant をバインドすると、Liberty サーバーが ektorp client library (org.ektorp-1.4.1.jar) をロードし、利用できるようになります。また、Maven Repository から入手することもできます。

    今回開発するアプリケーションは、ektorp client library を利用します。

5.1. Eclipse でのアプリケーション開発

アプリケーションは Maven プロジェクトで開発します。Maven により ektorp client library を依存関係も含めてローカルに収集することができます。

  • Maven Integration for Eclipse (m2e)

    Maven プロジェクトを作成するために、Eclipse のプラグインである "Maven Integration for Eclipse (m2e)" が必要です。Eclipse Luna であればデフォルトで導入されています。もし導入されていない場合は、Eclipse Marketplace から導入することができます。

5.1.1. Maven プロジェクト作成/pom.xml 更新

  1. Maven プロジェクトを作成する。
    • File > New > Maven Project
    • Create a simple project を選択し、Next をクリック
    • Group ID 等を入力し、Finish をクリック
  2. Project Facets を更新する。
    • Project Explorer ビュー > MemoApp を右クリックし、Properties をクリック
    • Project Facets で以下の Facet がチェックされていることを確認し、バージョン変更を実施
  3. pom.xml を更新する。
    • Project Explorer ビュー > MemoApp > pom.xml をダブルクリック
    • pom.xml タブで、以下のように<dependencies>~</dependencies>を追加して保存
      • groupID: com.ibm の systemPath の<liberty インストールディレクトリ>は環境に合わせて修正
        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>dw.demo</groupId>
          <artifactId>MemoApp</artifactId>
          <version>1</version>
          <packaging>war</packaging>
          <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.0.1</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.ektorp</groupId>
                <artifactId>org.ektorp</artifactId>
                <version>1.4.1</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>com.ibm</groupId>
             <artifactId>websphere.appserver.api.json</artifactId>
                <version>1.0.1</version>
                <scope>system</scope>
                <systemPath><libertyインストールディレクトリ>\dev\api\ibm\com.ibm.websphere.appserver.api.json_1.0.1.jar</systemPath>
            </dependency>
          </dependencies>
        </project>

        補足: 上記の groupID が javax.servlet、org.ektorp の jar ファイルは Liberty サーバーが持ち、war ファイルには含めないため、scope は provided とする。groupID が com.ibm の jar ファイルは、Maven Repository から入手できない Liberty サーバーの jar ファイルのため、scope を system として systemPath を指定する。

    • Dependency Hierarchy タブで依存関係を参照できる

      補足: 収集された jar ファイルは、Windows の使用ユーザーのホームディレクトリ配下の ".m2" ディレクトリ配下に格納されている。

5.1.2. 開発作業

はじめに、Cloudant を利用するうえでポイントとなるアプリケーションから Cloudant への接続について解説します。

  • Cloudant への接続

    Cloudant への接続に必要となるサービスインスタンスの情報は、アプリケーションにバインドすると、Bluemix の環境変数 (VCAP_SERVICES) に登録されます。また、データベース名については、後続で実施する Bluemix へのデプロイ時に、環境変数 (USER-DEFINED) に登録します。

    環境変数 (VCAP_SERVICES) の例です。

    {
    "cloudantNoSQLDB":[{
    "name":"cloudantNoSQLDB-demo",
    "label":"cloudantNoSQLDB",
    "tags":["ibm_created","data_management"],
    "plan":"Shared",
    "credentials":{
    "username":"6c1b440f-c061-49ff-895d-392776e59521-bluemix",
    "password":"b8e8f1cd6cca4f411cd87978830d73c2974643820d7922d9ce7d36e810c564ce",
    "host":"6c1b440f-c061-49ff-895d-392776e59521-bluemix.cloudant.com",
    "port":443,
    "url":https://6c1b440f-c061-49ff-895d-392776e59521-bluemix:b8e8f1cd6cca4f411cd87978830d73c2974643820d7922d9ce7d36e810c564ce@6c1b440f-c061-49ff-895d-392776e59521-bluemix.cloudant.com
    }
    }]
    }
    • key: サービス名 (cloudantNoSQLDB)
    • name: サービス追加時にユーザーが指定するサービスインスタンス名
    • username: Cloudant への接続ユーザー名
    • password: Cloudant 接続時のパスワード
    • host: Cloudant のサーバーのホスト名
    • port: Cloudant のサーバーのポート番号

    VCAP_SERVICES は上記のように、JSON 形式となっているため、Liberty が提供する "com.ibm.json.java.JSONArray, JSONObject" クラスを使用して読み込みます。

    環境変数から読み込んだ情報を基に、ektorp client library を使用して Cloudant のデータベースへの接続を作成します。

    public CouchDbConnector getDBConnector(String host, int port,
    			String username, String password, String dbName, String serviceName) {
    
    		CouchDbInstance dbInstance = null;
    		
    		System.out.println("Creating couch db instance...";);
    			httpClient = new StdHttpClient.Builder().host(host).port(port)
    			.username(username).password(password).enableSSL(true)
    			.relaxedSSLSettings(true).build();
    
    			dbInstance = new StdCouchDbInstance(httpClient);
    		}
    
    		CouchDbConnector dbConnector = new StdCouchDbConnector(dbName,
    				dbInstance);
    		dbConnector.createDatabaseIfNotExists();
    
    		return dbConnector;
    	}

    補足: "Resource Injection"、"JNDI lookup" による接続方法もあります。こちらは developerWorks の記事「Java and Cloudant NoSQL DB on Bluemix」をご参照ください。

    その他、データの参照、作成、更新、削除については、JazzHub でコードをご参照ください。

  • 開発作業

    開発物は以下です。JazzHub から完成済みの Maven プロジェクトを入手できるので、ご自身の開発環境で、各開発物を Maven プロジェクトに作成してください。また、web.xml で、ListMemo をトップページに設定してください。

    : Maven プロジェクトに自動的に web.xml が作成されない場合、"Project Explorer ビュー > MemoApp を右クリック後、JavaEETools > Generate Deployment Descriptor Stub をクリックして作成できます。

    • サーブレット
      • AbstractMemoAppServlet : Cloudant のデータベースへの接続を作成する抽象クラス。他のサーブレットが継承する
      • ListMemo : メモの一覧 (登録日時、タイトル) を、メモの登録日時順にソートして表示する
      • ShowMemo : メモの詳細 (登録日時、タイトル、内容) を表示する
      • RegistrateMemo : メモを新規登録する
      • UpdateMemo : メモを更新する
      • DeleteMemo : メモを削除する

        : サーブレットの Java pakage は、"dw.demo.servlet" としています。

    • JSP ファイル
      • listmemo.jsp: メモ一覧を表示する画面
      • showmemo.jsp: メモ詳細を表示する画面
      • registratememo.jsp: メモを新規登録する画面
    • JavaScript
      • listmemo.js: メモ一覧の表を作成する

5.2. Bluemix でのテスト (Web アプリケーションをデプロイ)

5.2.1. Web アプリケーションをデプロイ

Eclipse から Web アプリケーションをデプロイする際に、Cloudant の追加/バインド、環境変数へのデータベース名の登録を実施します。

  1. Bluemix に SimpleApp をデプロイする。
  2. MemoApp が Bluemix にデプロイされたことを確認する。

5.2.2. Cloudant の DB/view を作成

Bluemix のコンソールである"ACE UI"にログインし、アプリケーションで使用する Cloudant のデータベース及び view を作成します。

  1. Bluemix の "ACE UI" にログインする。
  2. Cloudant のコンソールを表示する。
  3. データベースを作成する。
  4. view を作成する。

5.2.3. テスト

Bluemix にデプロイした MemoApp をテストします。

  1. MemoApp にアクセスする。
  2. メモの新規登録を確認する。
  3. メモの詳細表示及び更新を確認する。
  4. メモの削除を確認する。

5.2.4. Bluemix の構成確認 (server.xml、VCAP_SERVICES)

Cloudant をバインドすることで、Liberty サーバーの server.xml や環境変数 (VCAP_SERVICES) が、どのように構成されているか確認します。

  1. server.xml を確認する。
    • Server ビュー > IBM Bluemix > MemoApp をダブルクリック
    • 画面右下の Remote Systems View をクリック
    • server.xml をダブルクリック
    • couchdb-1.0 フィーチャーが構成され、<classloader>、<couchdb>、<library>要素が設定されていることがわかります。

      : couchdb-1.0 (CouchDB Client Driver Connector) は、JNDI、リソースインジェクションによる CouchDB (Cloudant も CouchDB の一種) へのアクセスを可能にする Liberty サーバーのフィーチャー

      <server description="new server">
          <!-- Enable features -->
          <featureManager>
              <feature>jsf-2.0</feature>
              <feature>jsp-2.2</feature>
              <feature>servlet-3.0</feature>
              <feature>ejbLite-3.1</feature>
              <feature>cdi-1.0</feature>
              <feature>jpa-2.0</feature>
              <feature>jdbc-4.0</feature>
              <feature>jndi-1.0</feature>
              <feature>managedBeans-1.0</feature>
              <feature>jaxrs-1.1</feature>
              <feature>appstate-1.0</feature>
              <feature>icap:managementConnector-1.0</feature>
              <feature>couchdb-1.0</feature>
              <feature>cloudAutowiring-1.0</feature>
          </featureManager>
          <httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="${port}"/>
          <appstate appName="myapp" markerPath="${home}/.liberty.state"/>
          <application name="myapp" context-root="/" location="myapp" type="war">
              <classloader commonLibraryRef='cloudantNoSQLDB-library'/>
          </application>
          <logging logDirectory="${application.log.dir}"/>
          <include location="runtime-vars.xml"/>
          <webContainer trustHostHeaderPort="true" extractHostHeaderPort="true"/>
          <httpDispatcher enableWelcomePage="false"/>
          <logging consoleLogLevel="INFO"/>
          <applicationMonitor dropinsEnabled="false" updateTrigger="mbean"/>
          <config updateTrigger="mbean"/>
          <couchdb id='cloudantNoSQLDB-cloudantNoSQLDB-demo' jndiName='couchdb/cloudantNoSQLDB-demo' libraryRef='cloudantNoSQLDB-library' username='${cloud.services.cloudantNoSQLDB-demo.connection.username}' password='${cloud.services.cloudantNoSQLDB-demo.connection.password}' url='${cloud.services.cloudantNoSQLDB-demo.connection.url}'/>
          <library id='cloudantNoSQLDB-library'>
              <fileset id='cloudantNoSQLDB-fileset' dir='${server.config.dir}/lib' includes='commons-codec-1.6.jar commons-io-2.0.1.jar commons-logging-1.1.1.jar httpclient-4.2.5.jar httpclient-cache-4.2.5.jar httpcore-4.2.5.jar jackson-annotations-2.2.2.jar jackson-core-2.2.2.jar jackson-databind-2.2.2.jar jcl-over-slf4j-1.6.6.jar org.ektorp-1.4.1.jar slf4j-api-1.6.6.jar slf4j-jdk14-1.6.6.jar'/>
          </library>
      </server>
  2. 環境変数 (VCAP_SERVICES) を確認する。

5.3. ローカルでのテスト

ローカルの Liberty サーバーでアプリケーションのテストする方法をご紹介します。Cloudant のサービス及びデータベースは、前の章 (5.2 Bluemix でのテスト (Web アプリケーションをデプロイ) で作成済みのものを使用します。

ローカルでテストを実施するためには、前の章で確認した Bluemix の以下の設定を、ローカル環境で実施する必要があります。

  • 環境変数 (VCAP_SERVICES、USER-DEFINED)
  • Liberty サーバーの構成

この設定を実施することで、Bluemix とローカルとで同じコードでアプリケーションを稼動させることができます。

5.3.1. アプリケーションのデプロイ

MemoApp をローカルの Liberty サーバーにデプロイさせます。

ローカルに必要な構成が実施されていないため、アプリケーションの実行でエラーが発生します。アプリケーションを停止し、以下で必要な設定を実施していきます。

5.3.2. ローカルでの環境変数の設定 (Windows システム環境変数)

Bluemix の環境変数 (VCAP_SERVICES、USER-DEFINED) の値を、Windows のシステム環境変数に設定します。

  1. スタートボタン > コンピュータを右クリックする。
  2. プロパティをクリックする。
  3. システムの詳細設定をクリックする。
  4. 環境変数をクリックする。
  5. システム環境変数で新規をクリックし、以下の 2 つの変数名、変数値を登録する。
    1. 環境変数 (VCAP_SERVICES)
      • 変数名: VCAP_SERVICES
      • 変数値: 値は、サービスをバインドしている環境ごとに異なるため、"5.2.4 Bluemix の構成確認 (server.xml、VCAP_SERVICES) > 2) 環境変数 (VCAP_SERVICES) を確認" を参照して入力 (値は一行にして入力)
    2. USER-DEFINED
      • 変数名: CloudantDBName
      • 変数値: memodb
  6. コマンドプロンプトからシステム環境変数を echo し、設定確認する
    >echo %VCAP_SERVICES%
    {  "cloudantNoSQLDB" : [ {    "name" : "cloudantNoSQLDB-demo",    "label" : "cloudantNoSQLDB",    "plan" : "Shared",    "credentials" : {      "username" : "6c1b440f-c061-49ff-895d-392776e59521-bluemix",      "password" : "b8e8f1cd6cca4f411cd87978830d73c2974643820d7922d9ce7d36e810c564ce",      "host" : "6c1b440f-c061-49ff-895d-392776e59521-bluemix.cloudant.com",      "port" : 443,      "url" : "https://6c1b440f-c061-49ff-895d-392776e59521-bluemix:b8e8f1cd6cca4f411cd87978830d73c2974643820d7922d9ce7d36e810c564ce@6c1b440f-c061-49ff-895d-392776e59521-bluemix.cloudant.com"    }  } ]}
    
    >echo %CloudantDBName%
    memodb
  7. システム環境変数を Eclipse に反映するため、Eclipse を再起動する。

5.3.3. ローカルの Liberty サーバーの server.xml 構成

以下の 2 つの Liberty サーバーのフィーチャーを設定します。

  • couchdb-1.0 (CouchDB Client Driver Connector)

    JNDI、リソースインジェクションによる CouchDB (Cloudant も Couchdb の一種) へのアクセスを可能にします。

  • json-1.0

    JavaScript Object Notation (JSON4J) library へのアクセスを可能にします。アプリケーションでは、JSON 形式の VCAP_SERVICES を読み込むのに、com.ibm.json.java.JSONArray、com.ibm.json.java.JSONObject を使用しています。Bluemix では server.xml には記載ありませんが、このフィーチャーは、"jaxrs-1.1" で有効化されています。(前の章 (5.2.4 Bluemix の構成確認 (server.xml、VCAP_SERVICES) ) を参照)

  1. Eclipse の Server ビュー > WebSphere Application Server > Server Configuration をダブルクリックする
  2. Source タブで server.xml を以下のように更新する。

    : <couchdb> 要素内の Cloudant の接続情報 (username、password、url) は、VCAP_SERVICES を参照し、環境に合わせて更新してください。

    <server description="new server">
        <!-- Enable features -->
        <featureManager>
            <feature>jsp-2.2</feature>
            <feature>localConnector-1.0</feature>
            <feature>couchdb-1.0</feature>
            <feature>json-1.0</feature>        
    </featureManager>
    
        <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
        <httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>
        <applicationMonitor updateTrigger="mbean"/>
        <webApplication id="MemoApp" location="MemoApp.war" name="MemoApp">
        	<classloader commonLibraryRef='cloudantNoSQLDB-library'/>
        </webApplication>
        <couchdb id='cloudantNoSQLDB-cloudantNoSQLDB-demo' jndiName='couchdb/cloudantNoSQLDB-demo' libraryRef='cloudantNoSQLDB-library' username='6c1b440f-c061-49ff-895d-392776e59521-bluemix' password='b8e8f1cd6cca4f411cd87978830d73c2974643820d7922d9ce7d36e810c564ce' url='https://6c1b440f-c061-49ff-895d-392776e59521-bluemix:b8e8f1cd6cca4f411cd87978830d73c2974643820d7922d9ce7d36e810c564ce@6c1b440f-c061-49ff-895d-392776e59521-bluemix.cloudant.com'/>
        <library id='cloudantNoSQLDB-library'>
            <fileset id='cloudantNoSQLDB-fileset' dir='${server.config.dir}/lib' includes='commons-codec-1.6.jar commons-io-2.0.1.jar commons-logging-1.1.1.jar httpclient-4.2.5.jar httpclient-cache-4.2.5.jar httpcore-4.2.5.jar jackson-annotations-2.2.2.jar jackson-core-2.2.2.jar jackson-databind-2.2.2.jar jcl-over-slf4j-1.6.6.jar org.ektorp-1.4.1.jar slf4j-api-1.6.6.jar slf4j-jdk14-1.6.6.jar'/>
        </library>
    </server>

5.3.4. ローカルの Liberty サーバーのライブラリ追加

server.xml の'cloudantNoSQLDB-library'としてロードされる ektorp 等の jar ファイルをローカルの Liberty サーバーに用意します。Maven により収集された jar ファイルは Windows ユーザーのホームディレクトリ配下の ".m2" 以下に格納されているので、各 jar ファイルを検索して、ライブラリパスにコピーします。

ただし、org.ektorp-1.4.1.jar について Maven により依存関係で収集される jar ファイルと、Bluemix が couchdb-1.0 用にロードする jar ファイルとでバージョン等の差異があります。

 バージョン
httpcoreBluemix:4.2.5 Maven:4.2.4
jacl-over-slf4jBluemix:1.6.6 Maven:なし
slf4j-apiBluemix:1.6.6 Maven:1.6.4
slf4j-jdk14Bluemix:1.6.6 Maven:なし

ローカル環境でも、Bluemix と同じ jar ファイルを使用してテストするために pom.xml を更新して、Maven が Bluemix との差異分の jar ファイルを収集するようにします。

  1. pom.xml の<dependencies>要素に、以下を追加する。
    <dependency>
    	<groupId>org.apache.httpcomponents</groupId>
    	<artifactId>httpcore</artifactId>
    	<version>4.2.5</version>
            <scope>provided</scope>		
    </dependency>
    <dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>jcl-over-slf4j</artifactId>
    	<version>1.6.6</version>
    	<scope>provided</scope>
    </dependency> 
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>slf4j-jdk14</artifactId>
    	<version>1.6.6</version>
            <scope>provided</scope>
        </dependency>
  2. jar ファイルをライブラリパスに格納する。
    • 対象の jar ファイル: server.xml の<fileset>要素を参照
    • ライブラリパス: <Liberty インストールディレクトリ>/usr/servers/defaultServer/lib

      注: couchdb-1.0 用の jar ファイルは、Bluemix が "usr/servers/defaultServer/lib に配置するため、war には含めません。また、Liberty サーバーをデプロイする場合も考慮して、Bluemix と同じパスとします。

5.3.5. テスト

ローカルの Liberty サーバーを起動し、MemoApp にアクセスして、アプリケーションを操作します。

5.4. Bluemix でのテスト (Liberty サーバーをデプロイ)

Bluemix は、Web アプリケーションをデプロイした場合だけでなく、Liberty サーバーをデプロイした場合にも、server.xml を確認し、Cloudant 用の構成を実施します。例えば、server.xml に<couchdb>要素がなければ、設定を追加します。すでに設定がなされている場合には、必要に応じて設定を実施します。

今回のように、すでにローカル環境に Cloudant 用の構成を実施している場合には、server.xml の Cloudant の接続情報 (user、password、url) を、バインドするサービスにあわせて Bluemix が更新します。

以下で Liberty サーバーを Bluemix にデプロイし、MemoApp の稼動及び Bluemix の server.xml の確認を実施します。

5.4.1. Liberty サーバーをデプロイ

  1. 事前準備として、SimpleApp をデプロイした Liberty サーバーを Bluemix から Remove する。
  2. ローカルの Liberty サーバーを停止する。
  3. Bluemix に Liberty サーバーをデプロイする。
    • Web アプリケーションをデプロイする手順を参照

    : Bluemix に Add する対象を MemoApp から WebSphere Application Server Liberty Profile に変更する

5.4.2. テスト

Bluemix にデプロイした Liberty サーバーの MemoApp にアクセスして、アプリケーションを操作します。

補足: Liberty サーバーをデプロイする場合にはコンテキストルートが存在するため、アクセスする URL は、"Mapped URLs/MemoApp" にする

5.4.3. Bluemix の Liberty サーバーの server.xml を確認

Eclipse の Remote Systems View で、Bluemix 上の server.xml を参照します。以下のように、<couchdb>要素の "username"、"password"、"url" がローカルで設定した内容から、MemoApp にバインドしている Cloudant の内容に更新されていることがわかります。(今回は、ローカルと Bluemix とで同じ Cloudant のインスタンスですが、ローカルでは server.xml に値を入力しており、Bluemix では" runtime-vars.xml"に定義された変数となっています)

<server description="new server">
    <!-- Enable features -->
    <featureManager>
        <feature>jsp-2.2</feature>
        <feature>localConnector-1.0</feature>
        <feature>couchdb-1.0</feature>
        <feature>json-1.0</feature>
        <feature>icap:managementConnector-1.0</feature>
        <feature>cloudAutowiring-1.0</feature>
    </featureManager>
    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint httpPort="${port}" id="defaultHttpEndpoint" host="*"/>
    <applicationMonitor updateTrigger="mbean"/>
    <webApplication id="MemoApp" location="MemoApp.war" name="MemoApp">
        <classloader commonLibraryRef="cloudantNoSQLDB-library"/>
    </webApplication>
    <couchdb id="cloudantNoSQLDB-cloudantNoSQLDB-demo" jndiName="couchdb/cloudantNoSQLDB-demo" libraryRef="cloudantNoSQLDB-library" username="${cloud.services.cloudantNoSQLDB-demo.connection.username}" password="${cloud.services.cloudantNoSQLDB-demo.connection.password}" url="${cloud.services.cloudantNoSQLDB-demo.connection.url}"/>
    <library id="cloudantNoSQLDB-library">
        <fileset id="cloudantNoSQLDB-fileset" dir="${server.config.dir}/lib" includes="commons-codec-1.6.jar commons-io-2.0.1.jar commons-logging-1.1.1.jar httpclient-4.2.5.jar httpclient-cache-4.2.5.jar httpcore-4.2.5.jar jackson-annotations-2.2.2.jar jackson-core-2.2.2.jar jackson-databind-2.2.2.jar jcl-over-slf4j-1.6.6.jar org.ektorp-1.4.1.jar slf4j-api-1.6.6.jar slf4j-jdk14-1.6.6.jar"/>
    </library>
    <webContainer trustHostHeaderPort='true' extractHostHeaderPort='true'/>
    <include location='runtime-vars.xml'/>
    <logging logDirectory='${application.log.dir}'/>
    <httpDispatcher enableWelcomePage='false'/>
    <config updateTrigger='mbean'/>
</server>

5.5. まとめ

メモ帳 Web アプリケーションを例に、Liberty 及び Cloudant を利用した Web アプリケーション開発、デプロイ、テスト (Bluemix、ローカル) の方法をご紹介しました。

Bluemix にデプロイする Web アプリケーション (または Liberty サーバー) に Cloudant をバインドすることで、Cloudant を利用できるようになります。

  • Bluemix の環境変数 (VCAP_SERVICES) に Cloudant の接続情報が登録される
  • Liberty サーバーに、couchdb-1.0 フィーチャーが構成され、ektorp client library が利用可能となる

Liberty サーバーに対する couchdb-1.0 フィーチャーの構成は、Web アプリケーションをデプロイする場合、Liberty サーバーをデプロイする場合、どちらのデプロイ方法でも、必要に応じて Bluemix が実施します。

当記事では、Bluemix への 2 つのデプロイ方法に加えて、ローカル環境のテスト方法についてもご紹介しています。ektorp client library を使用したメモ帳 Web アプリケーションの Maven プロジェクトを JazzHub で公開していますので、ぜひアプリケーション開発の参考としてご参照ください。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, WebSphere, DevOps
ArticleID=992020
ArticleTitle=Bluemix 上で稼動する Web アプリケーション開発方法 - Java 編
publish-date=12112014