normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

2011年12月 Windows Azure の大幅更新 〜Java編〜

今回は 「Windows Azure の大幅更新」における Java の利用方法のTIPSを紹介する。MS公式で公開している「"Hello World" Web Application using Eclipse」の手順に従った場合にも、いくつか注意点があるので、本TIPSを活用いただければ幸いだ。
また、Windows Azure for Java については先人がいるので、必要な場合はこちらを参照してほしい。

前提環境について

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サーバ毎のセットアップスクリプトが格納されている。TomcatGlassFish、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 を実行することができた。

*1:Eclipse 3.7 は Windows Azure プラグインが未対応

*2:Windows Azure Project以外でももちろん利用可能

*3:例では Tocmat 7.x

*4:jdk.zip と tomcat7.zip