■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年09月27日

    Java総合講座 - 初心者から達人へのパスポート
                  vol.172

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.SOAPのアプリケーション(Webサービス)
========================================================


では、いよいよ、このホテル予約のWebサービスをLinuxのPCに装備する
作業に入っていきましょう

まずLinuxのPCに、ホテル予約のWebサービスが使用するデータベース
を作成しておきましょう。

これには、vol.103でお話したmysqldumpコマンド等を利用して、Windowsの
PCに作成済みのデータベースをLinuxのPCにポーティング(porting=移植)
すると楽です。(mysqldumpが何だったか忘れた人はvol.103を復習のこと。)


┌───────────────────────────┐
  MySQLのデータベースをWindows環境からLinux環境に移植
└───────────────────────────┘

最初に、EclipseのPC(WindowsのPC)でmysqldumpコマンドを使って、データベース
の内容をファイル出力しておきます。

今回も、vol.103で使ったMySQL_worksフォルダーにファイルを書き出すことに
しましょう。

まず、コマンド・プロンプトを開いて、

cd MySQL_works

と入力してMySQL_worksディレクトリー(フォルダー)に移ります。
続いて、mysqldumpコマンドを入力しましょう。

mysqldump -u root -prootpass --databases HOTELDB > HOTELDB.sql

と入力します。
これで、MySQL_worksディレクトリーの中にHOTELDB.sqlファイルが作成されました。

このHOTELDB.sqlファイルの中を覗いてみて下さい。CREATE DATABASEやら
CREATE TABLEやら、すべて必要なSQL文がそろっていますね。

ここで、ちょっと注意しないといけないことは、Windows環境のMySQLでは、データ
ベース名やテーブル名に大文字と小文字の区別がないのに対し、LinuxやUNIXの環境
では、大文字と小文字が区別される(別の名前と見なされる)ということです。
なお、Windows環境では実際の保管時にはデータベース名やテーブル名はすべて
小文字に変換されてから保管されます。

一方、ホテル予約のWebサービスのプログラム中では、これらの名前は大文字にして
参照していました。

しかし、HOTELDB.sqlファイルの中を見るとデータベース名やテーブル名が小文字
になっています。これらのSQL文を使ってLinux環境下でデータベースやテーブル
を作成すると、小文字の名前になってしまいますので、このままではWebサービスの
プログラムからはアクセスできません(小文字と大文字の違いだけなのに別のもの
として扱われてしまう)。

しかし、幸いLinuxやUNIXの環境でも、MySQLのlower_case_table_namesというシステ
ム変数を1に設定してやると、Windows環境と同じ処理が行われるようになっています。
ただし、この場合、(最初からlower_case_table_namesを1に設定して使っていれば
問題はありませんが)途中からlower_case_table_namesを1に変更すると、それまで
に大文字と小文字で区別していた名前が使えなくなるなどの問題が発生することに
なります。(Linuxでのlower_case_table_namesのデフォルト値は0です。)


今回は、幸い初めてLinux環境でMySQLを使い始めるということなので、迷わずに
lower_case_table_namesを1に設定してから使い始めることにしましょう。

では、LinuxのPCを立ち上げてから、EclipseのPC(WindowsのPC)でTera Termを
使ってLinuxのuser01にログインしておきましょう。
そして、
su -
でrootになっておきます。

つづいて、/etc/my.cnfファイル(MySQLのオプション指定を行う構成ファイル)
を編集

vi /etc/my.cnf

して、その中の

[mysqld]

という行の下に

lower_case_table_names=1

という行を追加して下さい。
(編集が終わったら、ファイルを保管して閉じます。)

これでデータベース名・テーブル名の大文字・小文字の問題は解決です。


では、MySQLサーバー(デーモン)を起動しておきましょう。

service mysqld start

と入力します。すると、初めての起動時には何やらたくさんメッセージが出ます
(初期設定を行っています)が、最後に

MySQL を起動中:                                      [  OK  ]

というようなメッセージが出ればOKです。


ここで、MySQLのrootユーザーに(WindowsのPCのときと同じく)rootpassという
パスワードを設定しておきましょう。(もちろん、本番用のMySQLであれば、この
ような推測しやすいパスワードは避けるべきです。なお、MySQLのrootユーザー
はLinuxのrootユーザーとは別物ですので、パスワードもLinuxのrootユーザーと
は無関係に設定できます。)

mysqladmin -u root password rootpass

と入力します。


続いて、FFFTPを起動して、Linux(CentOS)のPCに接続し、FFFTPのウインドウの
左側(WindowsのPC側)のフォルダーを先ほどのMySQL_worksに変更しておきま
しょう。(FFFTPの使い方の詳細については前回(vol.171)を参照。)
また、右側(LinuxのPC側)のディレクトリーは/home/user01になっていることを
確認しておきましょう。

そして、左側のMySQL_worksの中のHOTELDB.sqlを選択し、ツール・バーの「A」の
マーク(赤い字のマーク)のボタン(アスキー・モードを表す)をクリックし、
「無」のマーク(漢字コードの変換なし)のボタンをクリックします。
そして、上向きの矢印「↑」(青色)のボタン(アップロードを表す)をクリック
します。

これで、右側の/home/user01のほうにHOTELDB.sqlが入りましたね。これで
HOTELDB.sqlファイルがLinuxのPCに転送されたので、FFFTPのウインドウは
閉じておきましょう。


では、Tera Termに戻って、次のコマンドを入力して下さい。

cd /home/user01

mysql -u root -prootpass -e "source HOTELDB.sql"

これで、WindowsのPCのデータベースと同じ内容がLinuxのPCにも入りました。


ここで、このMySQLサーバーもLinuxのPCを起動したときに自動起動されるように
設定しておきましょう。

chkconfig mysqld on

と入力します。
この設定状況を確認しましょう。

chkconfig --list mysqld

と入力します。
このコマンドに対する結果が、

mysqld         0:off   1:off   2:on    3:on    4:on    5:on    6:off

というふうに、2、3、4、5がonになっていれば自動起動が設定されています。


┌───────────────────────────┐
  MySQLのデータベースのJNDIリソースの登録
└───────────────────────────┘

このデータベースについて、TomcatにJNDIリソースの記述とリソース・ファクトリー
の設定をしておくことが必要でしたね。(忘れた人はvol.139を復習)

というわけで、ここで行っておきましょう。

まず、AxisのWebアプリケーション・デプロイメント記述子(web.xml)を編集

vi /usr/share/tomcat5/webapps/axis/WEB-INF/web.xml

して、web-appタグの下に下記のような内容を追加します。

--------------------------------------------------------
<resource-ref>
  <description>
    HOTELDB database
  </description>
  <res-ref-name>
    jdbc/HOTELDB
  </res-ref-name>
  <res-type>
    javax.sql.DataSource
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>
--------------------------------------------------------

(編集が終わったら、保管して閉じます。)


続いて、server.xmlファイルを編集

vi /usr/share/tomcat5/conf/server.xml

して、その中のHostタグ
(Hostタグは、

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">

というふうになっている3行です。)
の下に下記のような内容を追加します。

--------------------------------------------------------
<Context path="/axis" reloadable="true">
  <Resource name="jdbc/HOTELDB" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://127.0.0.1:3306/HOTELDB"
    username="root"
    password="rootpass"
    maxActive="10"
    maxIdle="30"
    maxWait="10000"
    defaultAutoCommit="false" />
</Context>
--------------------------------------------------------

(編集が終わったら、保管して閉じます。)

この設定を行うと、(Webアプリケーションではなく)Tomcat自身がMySQLの
JDBCドライバー(com.mysql.jdbc.Driver)にアクセスすることになります。

この場合、JDBCドライバーのJARファイルを/usr/share/tomcat5/shared/libに
置いたのではTomcatがアクセスできません(すべてのWebアプリケーションが
アクセスできるがTomcatはアクセスできない)。
この場合は特別で、/usr/share/tomcat5/shared/libではなく、
/usr/share/tomcat5/common/libに置く必要があります。
(/usr/share/tomcat5/common/libであればTomcat自身もアクセスするし、
すべてのWebアプリケーションからもアクセスできる。)

というわけで、次のように操作して、JDBCドライバーのJARファイルを
/usr/share/tomcat5/shared/libから/usr/share/tomcat5/common/libに移動しておき
ましょう。(前回JDBCドライバーのJARファイルを/usr/share/tomcat5/shared/libに
置いたのは間違いでした。訂正いたします。)

cd /usr/share/tomcat5/shared/lib

mv mysql-connector-java-5.0.8-bin.jar /usr/share/tomcat5/common/lib/



以上で、データベース関連の設定作業が完了しました。

(なお、Tomcatは再起動しておきましょう。)



では、いよいよWebサービスのデプロイ作業に入りましょう。


┌───────────────────────────┐
  Webサービスのデプロイ
└───────────────────────────┘

まず最初に、CVSリポジトリーに登録されているソース・ファイルからAntでコンパイル
&デプロイを行うようにしましょう。(これは本番用ではなく、テスト段階などで
使われる形式のデプロイです。本番用のデプロイはまたあとでお話します。)

もちろん、CVSリポジトリーの中を直接いじってはいけませんので、いったん作業用の
ユーザーのディレクトリーにコピー(CVSのチェックアウト機能を使う)してから行い
ます。


まずデプロイ作業を含め開発作業を行うためのLinuxのユーザー(ここではdevuser01
という名前にする)を作成しておきましょう。このユーザーはCVSを使用できるように
cvsusersグループに所属させます。

useradd -G cvsusers devuser01

と入力します。

そして、このユーザーのパスワードを設定しておきます。

passwd devuser01
(ここでパスワードを2回聞いてくるので答える。当メールマガジンではわかりやすく
dev1234567としておきますが、もちろんこんなわかりやすいパスワードは実際には使う
べきではありません。)

では、このユーザー(devuser01)になりましょう。

su - devuser01

と入力します。

次に、CVSリポジトリーの中のJStudySOAPモジュールをチェックアウトしましょう。

cvs -d /var/cvs/repo checkout JStudySOAP

と入力します。ここで、/var/cvs/repoというのは、CVSリポジトリーのディレクトリー
でしたね。(忘れた人は、vol.166を参照のこと)

これで、このユーザーのホーム・ディレクトリー(/home/devuser01)の配下に
JStudySOAPというディレクトリーができているはずです。確認してみて下さい。



このディレクトリーの中にはビルド・ファイル(build.xml)も含まれていますが、
少し書き換える必要があります。


まず、WindowsのPC(EclipseのPC)では、EclipseでJavaのソース・ファイルを保管
した時点で自動的にコンパイルがされていたので、build.xmlには、コンパイルの
ステップを入れていませんでした。
しかし、CVSリポジトリーに登録されているのはソース・ファイルだけであり、バイト
コードは含まれていません。したがって、build.xmlにコンパイルのステップを入れて
バイトコードを作っておく必要があります。(このステップはEclipseのときにも
入っていても構わないものであり、特にLinuxなどの環境に依存するものではあり
ません。)

という訳で、build.xmlを編集

vi JStudySOAP/build.xml

して、下記のようなソース・コードにしましょう。

--------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
 <project name="WebServices Deploy" basedir="." default="wsdl2java">
   <property file="build.properties" />

   <path id="axis.classpath">
     <fileset dir="${axis.dir}/lib">
        <include name="**/*.jar" />
      </fileset>
   </path>
  
   <taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
  
   <target name="java2wsdl">
     <axis-java2wsdl
      classname="jp.co.flsi.lecture.soap.hotelinterface.Hotel"
      location="http://localhost:8080/axis/services/Hotel"
      namespace="http://hotel.webservice.lecture.flsi.co.jp/"
      output="${local.wsdl}" >
        <classpath>
          <pathelement path="${classes.dir}"/>
        </classpath>
     </axis-java2wsdl>
   </target>

   <target name="wsdl2java" depends="java2wsdl">
     <axis-wsdl2java
      output="${sources.dir}"
      serverside="true"
      url="${local.wsdl}" >
     </axis-wsdl2java>
   </target>

    <target name="compile">
      <javac encoding="UTF-8"
        srcdir="${sources.dir}"
        destdir="${classes.dir}"
        includes="jp/co/flsi/lecture/webservice/hotel/**/**"
        debug="on" >
          <classpath>
            <fileset dir="${axis.dir}/lib">
              <include name="**/*.jar" />
            </fileset>
            <fileset dir="${tomcat.share}/lib">
              <include name="**/*.jar" />
            </fileset>
          </classpath>
      </javac>
    </target>

    <target name="jar"  depends="compile">
      <jar destfile="${work.dir}/hotel.jar"
        basedir="${classes.dir}"
        includes="**/**"
      />
    </target>

    <target name="copy"  depends="jar">
      <copy todir="${axis.dir}/lib">
        <fileset dir="${work.dir}">
          <include name="**/hotel.jar"/>
        </fileset>
      </copy>
    </target>

    <target name="deploy" depends="copy">
      <axis-admin port="8080" hostname="localhost" failonerror="true"
       servletpath="${axisservlet}" debug="true" xmlfile="${wsdd.deployfile}" />
    </target>

    <target name="undeploy">
      <axis-admin port="8080" hostname="localhost" failonerror="true"
       servletpath="${axisservlet}" debug="true" xmlfile="${wsdd.undeployfile}" />
    </target>
 </project>
--------------------------------------------------------

(編集が終わったら、ファイルを保管して閉じましょう。)

編集したところは、"compile"のターゲット

    <target name="compile">
      <javac encoding="UTF-8"
        srcdir="${sources.dir}"
        destdir="${classes.dir}"
        includes="jp/co/flsi/lecture/webservice/hotel/**/**"
        debug="on" >
          <classpath>
            <fileset dir="${axis.dir}/lib">
              <include name="**/*.jar" />
            </fileset>
            <fileset dir="${tomcat.share}/lib">
              <include name="**/*.jar" />
            </fileset>
          </classpath>
      </javac>
    </target>

を追加したところと、"jar"のターゲットを"compile"ターゲットにdependsさせた、
つまり

    <target name="jar">



    <target name="jar"  depends="compile">

に変更したところです。
それから、以前存在していたnative2ascii関連の2行(下記)

      <native2ascii encoding="Shift_JIS" src="${sjis.dir}"
       dest="${axis.dir}/classes" includes="**/*.properties" />

はプロパティー・ファイルの中の漢字のコードをASCIIに変換することを説明するため
にテスト的に作成したにすぎない(その後、削除し忘れていた)ので、削除しました。
なお、この変換対象になっていたプロパティー・ファイル(runmode.properties)は、
現在(漢字を含まない内容で)別の目的(Eメール送信のための各種パラメーターの指定)
のために使用しているので、あとで別途作成します。



ここで、以上の編集後のビルド・ファイル(build.xml)はWindowsのPC(EclipseのPC)
でもそのまま使用できることに注目しておきましょう。OSには依存していないのです。
OSに依存する部分は、このビルド・ファイルが参照しているbuild.propertiesの中に
収められています。

すなわち、このビルド・ファイルが参照しているbuild.propertiesファイルの中では、
WindowsのPCにおけるディレクトリー指定をしていますが、これらはLinuxでは使用でき
ないので、LinuxのPCにおけるディレクトリー指定に書き換える必要があります。
という訳で、build.propertiesファイルも編集

vi JStudySOAP/build.properties

して、下記のような内容にしましょう。

--------------------------------------------------------
work.dir=/home/devuser01/JStudySOAP
classes.dir=/home/devuser01/JStudySOAP/bin
sources.dir=/home/devuser01/JStudySOAP/src
axis.dir=/usr/share/tomcat5/webapps/axis/WEB-INF
tomcat.share=/usr/share/tomcat5/shared
local.wsdl=${work.dir}/Hotel.wsdl
axisservlet=axis/services/AdminService
wsdd.dir=${sources.dir}/jp/co/flsi/lecture/webservice/hotel
wsdd.deployfile=${wsdd.dir}/deploy.wsdd
wsdd.undeployfile=${wsdd.dir}/undeploy.wsdd
--------------------------------------------------------

(編集が終わったら、ファイルを保管して閉じましょう。)

ここでは不要な行は削除し、tomcat.shareの行を新たに追加していることにも注意して
下さい。


では、さっそくAntを使ってデプロイを行ってみましょう。

(まず環境を現在のまま維持(「su -」ではなく「su」)してスーパーユーザーに
なります。)
su
(ここでrootのパスワードを聞いてくるので答える。)

(JStudySOAPディレクトリーに移動します。)
cd JStudySOAP/

(デプロイを実行します。)
ant deploy

┌補足─────────────────────────┐
ここで

[javac] 注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
[javac] 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。

というような警告メッセージが出ますが無視して下さい。
本来なら、

<javac .....>
   <compilerarg value="-Xlint:unchecked" />
   .....
</javac>

というように-Xlint:uncheckedオプションを指定して詳しい
メッセージを出させて確認すべきですが、今回のプログラムに
関しては、問題ないことがわかっていますので、無視して下さ
い。(Axisが生成したスタブやスケルトンで型が明示されてい
ないことに起因しており、我々が対処することではない。
なお、Eclipseを見ても、該当するソース・ファイルに警告の
マーク(黄色いマーク)が付いていることがわかる。)
└───────────────────────────┘


BUILD SUCCESSFULという結果が返ってきたらOKです。



┌───────────────────────────┐
  その他のプロパティー・ファイルの設定
└───────────────────────────┘

では、次に、プロパティー・ファイルrunmode.propertiesを
/usr/share/tomcat5/webapps/axis/WEB-INF/classes/
配下に作成しましょう。これは、vol.164で編集したものに準じますが、
実際の統合テストや本番環境などでは、その環境に合わせて新たに
書き直すことになります。
というわけで、

vi /usr/share/tomcat5/webapps/axis/WEB-INF/classes/runmode.properties

と入力して、下記のような内容に編集しましょう。

--------------------------------------------------------
mail.smtp.host=localhost
mail.smtp.port=25
mail.smtp.auth=false
userid=user01
password=87654321
from=user01@localhost
to=devuser01@localhost
--------------------------------------------------------

(見てわかるように、ここでは同じLinuxのコンピューター内のユーザーuser01から
ユーザーdevuser01にメールを送るように設定を行っています。)


┌補足─────────────────────────┐
メール関連の作業として、前回は、WindowsのPCにインストール
しておいたJavaBeans Activation FrameworkのJARファイルや
JavaMailのJARファイルをFTPでLinuxのPCにコピーしましたが、
CentOSには、オープン・ソース版のJavaBeans Activation
FrameworkやJavaMailも用意されています。
それぞれ、「GNU JavaBeans Activation Framework」(パッケー
ジはclasspathx-jaf.i386)と「GNU JavaMail」(パッケージは
classpathx-mail.i386)です。
これらオープン・ソース版の場合、JARファイルはそれぞれ

/usr/share/java/activation.jar



/usr/share/java/classpathx-mail/mailapi.jar

という配置でインストールされます。

これらを利用すれば、前回FTPを使って行った作業の代わりに

(配置先のディレクトリーに移動する。)
cd /usr/share/tomcat5/shared/lib

(activation.jarのシンボリック・リンクを作る。)
ln -s /usr/share/java/activation.jar

(mailapi.jarのシンボリック・リンクを作る。)
ln -s /usr/share/java/classpathx-mail/mailapi.jar

という操作で必要なJARファイルを配置することもできます。
└───────────────────────────┘



では最後に、Log4jのプロパティー・ファイルlog4j.propertiesを
/usr/share/tomcat5/webapps/axis/WEB-INF/classes/
配下に作成しましょう。これは、vol.159で編集したものを、FFFTPで
LinuxのPCにファイル転送してもいいですが、自分で編集したい人は、

vi /usr/share/tomcat5/webapps/axis/WEB-INF/classes/log4j.properties

と入力し、てvol.159と同様に下記のように内容を編集しましょう。

--------------------------------------------------------
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=*%-5p [%d] %c.%M: %m%n

# The following log is only for jp.co.flsi.lecture.webservice.hotel.db package.
log4j.logger.jp.co.flsi.lecture.webservice.hotel.db=DEBUG, B1
log4j.appender.B1=org.apache.log4j.FileAppender
log4j.appender.B1.file=logs/debugout.log
log4j.appender.B1.layout=org.apache.log4j.PatternLayout
log4j.appender.B1.layout.ConversionPattern=*%-5p [%d] %c.%M: %m%n
--------------------------------------------------------

なお、テスト時など状況に応じて、上のINFOをDEBUGなど他の指定に変更します。

(Tomcatは再起動しておきましょう。)



(次回に続く)


では、今日はここまでにします。



[Windowsは米国Microsoft Corporationの、米国およびその他の国における登録商標です。]

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2009 Future Lifestyle Inc. 不許無断複製