2011年12月 Windows Azure の大幅更新 〜Java編〜
今回は 「Windows Azure の大幅更新」における Java の利用方法のTIPSを紹介する。MS公式で公開している「"Hello World" Web Application using Eclipse」の手順に従った場合にも、いくつか注意点があるので、本TIPSを活用いただければ幸いだ。
また、Windows Azure for Java については先人がいるので、必要な場合はこちらを参照してほしい。
- Windows Azure for Java を試すよ その1 id:StateMachine:20111214
- Windows Azure for Java を試すよ その2 id:StateMachine:20111215
前提環境について
Windows 7、または Windows Server 2008 以降の OS と Eclipse 3.6*1 が必要となる。
- Windows 7 or Windows Server 2008 → Windows Vista はダメだが、試してみたら不安定ながら動作はした
- Eclipse Helios or lator → Eclipse 3.6以下が必要であり、最新版の Eclipse 3.7 にはプラグインが対応してない
プラグインの入手に関しては Download the Windows Azure SDK for Java を参照し、Eclipse 上のメニューから[Help]-[Install New Software]を選択し、以下の様にインストールを実施する。
Eclipse プロジェクト全体の構成について
Windows Azure の開発を行うためには、「Windows Azure Project」と「Dynamic Web Project」という二つのプロジェクトを作成する必要がある。Windows Azure Project は作成済みの war ファイルを利用してWindows Azure デプロイ用のパッケージを作成するプロジェクトであり、Dynamic Web Project は Windows Azure Project で利用するため*2の war ファイルを作成するためのプロジェクトだ。
war ファイルの作成/テストについては、Windows Azure 上で実行することなく、既存のAPサーバ*3で実行することが可能だ。Dynamic Web Project と Server プロジェクトを利用して war ファイルを作成/テストできる。こちらは Eclipse を利用した Java アプリケーションの一般的な手法であるため、本 TIPS では割愛する。
Eclipse のエクスポート機能を利用して、作成した war ファイルで Windows Azure Project 側の war ファイルを上書きする。その際、「Overwrite exsisting file」のチェックボックスを有効にしないとエラーとなるため注意が必要だ。
Windows Azure Project の構成について
Windows Azure Project 内には samples フォルダが存在し、以下にAPサーバ毎のセットアップスクリプトが格納されている。Tomcat、GlassFish、Jetty、JBoss AS のスクリプトが標準で提供されているが、もちろんカスタマイズすることも可能だ。
開発では、samples フォルダ以下のセットアップスクリプトを Worker ロール内の startup.cmd に記述する等で samples フォルダ以下のスクリプトを利用する。
標準のセットアップスクリプトでは JDK と AP鯖を特定のファイル名でアーカイブする必要がある*4。更に、アーカイブファイル内のフォルダ名についても注意が必要だ。これらの組み合わせは以下を参考にしていただきたい。
jdk.zip と tomcat7.zip は approot フォルダ直下に配置する必要がある点にも留意してほしい。
]
Windows Azure Emulator 側での実行
Windows Azure Project を右クリックして[Properties]を押下し、左側のツリービューから[Windows Azure]を選択する。こちらで[Build for:]に対して「Testing in emulator」を指定し、Windows Azure Emulator側で実行するためのビルド形式であることを指定する。次に Eclipse メニューから[Project]-[Build Project]を選択してビルドが正常に完了すると、deploy フォルダと emulatorTools フォルダが作成される。
アプリケーションの実行は、emulatorTools フォルダ以下の RunInEmulator.cmd を利用して実行する。パブリックポート 80 番、プライベートポート 8080 番として実行されるが、すでにポートが利用されている場合は自動で別ポートにマッピングしてくれる。この際、jdk.zip と tomcat7.zip を unzip するために多少の時間がかかる。SSDのマシンでは1分程度で起動したが、 id:StateMachine さんの環境では5分程度かかったようなので留意いただきたい。
上記の例では、80 番ポートが IIS で利用されているため 81 番ポートにマッピングしなおしている。
アプリケーションの実行が完了すると、ドライブ直下に Worker ロールのフォルダが作成される。Windows Azure Emulator 実行時、AP鯖のログはこちらから参照することが可能だ。
Eclipse 上でTomcat等を起動しっぱなしにしていると以下のログが出力され、Windows Azure アプリケーションの起動に失敗するので注意が必要だ。
致命的: StandardServer.await: create[localhost:8005]: java.net.BindException: Address already in use: JVM_Bind at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.PlainSocketImpl.bind(Unknown Source) at java.net.ServerSocket.bind(Unknown Source) at java.net.ServerSocket.<init>(Unknown Source) at org.apache.catalina.core.StandardServer.await(StandardServer.java:422) at org.apache.catalina.startup.Catalina.await(Catalina.java:706) at org.apache.catalina.startup.Catalina.start(Catalina.java:652) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)
ホスティッドサービス側での実行
デプロイ用のパッケージを作成する前に、Windows Azure Project を右クリックして[Properties]を押下し、左側のツリービューから[Windows Azure]-[Remote Access]を選択する。デフォルトの設定のままではデプロイに失敗するので、今回はいったん設定をオフにした。
次に、左側のツリービューから[Windows Azure]を選択する。こちらで[Build for:]に対して「Deployment to Cloud」を指定し、ホスティッドサービス側で実行するためのビルド形式であることを指定する。次に Eclipse メニューから[Project]-[Build Project]を選択してビルドが正常に完了すると、deploy フォルダにデプロイ用のファイルが作成される。
管理ポータルにアクセスし、作成されたデプロイ用ファイルをデプロイすることで無事 Tomcat 上で作成した war を実行することができた。