normalian blog

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

WindowsAzureToolkitForEclipseWithJava / StarterKit / CSPackAntTask を修正する

Microsoft Azure のクラウドサービス向けの Eclipse Plugin として Windows Azure Toolkit For Eclipse With Java があるのはご存知だと思う(未だに Windows Azure なのは置いといて)。こちらを利用して Eclipse 上からリモートデスクトップ、セッションアフィニティ、デプロイするロース数の設定等が可能だ。

ずいぶん進化が進んだもので、JBoss AS, Tomcat, Jetty はもちろん WebSphere も対応したそうだが、The Azure Toolkit for Eclipse now Includes WebSphere Liberty and Application InsightsIBM 社の WebSphere にも対応したらしいが、試してみたところうまく動かなかったので自身でプラグインをリコンパイルして確認をしてみた。ノウハウを死蔵してもしかたないので、今回は Windows Azure Toolkit For Eclipse With Java のリコンパイルの TIPS を紹介する。

修正箇所/内容

今回私が修正した個所は WindowsAzureToolkitForEclipseWithJava / StarterKit / CSPackAntTask であり、Eclipse プロジェクト内に .cspack.jar という隠しファイル名で格納されている個所だ。ソースコードを確認したところpackage.xml 設定ファイルから *.cspkg ファイルを作成する処理を担っている様だ。
こちらに対して「*.cspkg を作成する際の引数をログとして出力する処理」を追加する。

まずは Github から以下の定番コマンドでソースコードを取得する。

>git clone https://github.com/MSOpenTech/WindowsAzureToolkitForEclipseWithJava.git

上記に CSPackAntTask が含まれているので、Eclipse の既存プロジェクトのインポートから WindowsAzureToolkitForEclipseWithJava\StarterKit\CSPackAntTask を選択する。

ソースコードをインポート後、ビルドが通らないがどうやら org.apache.ant と com.microsoft.azure が足りないようなので、以下の pom.xml をダミーで作成して mvn eclipse:eclipse で依存 jar を取得する*1

<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>com.microsoft.azure</groupId>
	<version>0.7.0</version>
	<artifactId>azure-cspack-anttask</artifactId>
	<packaging>jar</packaging>

	<dependencies>
		<dependency>
			<groupId>org.apache.ant</groupId>
			<artifactId>ant</artifactId>
			<version>1.8.2</version>
		</dependency>
		<dependency>
			<groupId>com.microsoft.azure</groupId>
			<artifactId>azure-storage</artifactId>
			<version>2.0.0</version>
		</dependency>
	</dependencies>
</project>

次に *.cspack ファイル作成時のコマンド引数をログとして出力する処理を追加するため com.microsoftopentechnologies.windowsazure.tools.build.WindowsAzurePackage.java に以下の様に処理を追加する。ソースコードを見ればわかるが、中身に cspack.exe を利用している様だ。

	public void execute() throws BuildException {
		// <中略>

		// Run cspack.exe
		this.log("Starting package generation...");
		try {
			if (getSdkDir() != null) {
				// Get cspack.exe cmd-line
				List<String> csPackCmdLine = this.createCSPackCommandLine();

				//追加処理ここから
 				for (int i = 1; i < csPackCmdLine.size(); i++) {
					this.log("arg" + i + ": " + csPackCmdLine.get(i));
				}
				//追加処理ここまで

				this.runCommandLine(csPackCmdLine);
			} else {
				throw new IllegalArgumentException(
						"Azure SDK not found, cannot build non-CTP package");
			}
		} catch (Exception e) {
			reportBuildError(e);
		}

修正後、Ant を利用して備え付けの build.xml をたたくことで Eclipse プロジェクト内の jar フォルダに .cspack.jar が作成される。この時点での Eclipse プロジェクトの Package Explorer は以下のようになる。

最後に、CSPackAntTask\jar\.cspack.jar フォルダを Azure Eclipse プロジェクト内に含まれる .cspack.jar に上書きしてクラウドサービス上へのデプロイを試すと以下の様に追加処理のログが出力されている*2

Buildfile: D:\opt\workspace\HelloAzure\package.xml

checkResetScript:

resetEmulator:

waitForReset:

createwapackage:
       [mkdir] Created dir: D:\opt\workspace\HelloAzure\deploy
      [delete] Deleting directory D:\opt\workspace\HelloAzure\deploy.old
[windowsazurepackage] Verified attributes.
[windowsazurepackage] Role "WorkerRole1": Verifying the approot "D:\opt\workspace\HelloAzure\WorkerRole1\approot"
[windowsazurepackage] Role "WorkerRole1": Importing components...
[windowsazurepackage] 	Imported as 'jdk1.8.0_25' from "C:\Program Files\Java\jdk1.8.0_25"
[windowsazurepackage] 	Imported as 'jboss-as-7.1.1.Final.zip' from "D:\opt\jboss\jboss-as-7.1.1.Final"
[windowsazurepackage] Role "WorkerRole1": Finished importing components
[windowsazurepackage] Role "WorkerRole1": Generating component deployment script...
[windowsazurepackage] Role "WorkerRole1": Created internal startup script
[windowsazurepackage] Starting package generation...
[windowsazurepackage] arg1: D:\opt\workspace\HelloAzure\ServiceDefinition.csdef
[windowsazurepackage] arg2: /role:WorkerRole1;D:\opt\workspace\HelloAzure\WorkerRole1\approot
[windowsazurepackage] arg3: /rolePropertiesFile:WorkerRole1;D:\opt\workspace\HelloAzure\.rolePropertiesOS3
[windowsazurepackage] arg4: /out:D:\opt\workspace\HelloAzure\deploy\WindowsAzurePackage.cspkg
[windowsazurepackage] Executing '[C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.5\bin\cspack.exe, D:\opt\workspace\HelloAzure\ServiceDefinition.csdef, /role:WorkerRole1;D:\opt\workspace\HelloAzure\WorkerRole1\approot, /rolePropertiesFile:WorkerRole1;D:\opt\workspace\HelloAzure\.rolePropertiesOS3, /out:D:\opt\workspace\HelloAzure\deploy\WindowsAzurePackage.cspkg]'...
[windowsazurepackage] Process started
[windowsazurepackage] Microsoft(R) Azure(TM) Packaging Tool version 2.5.0.0
[windowsazurepackage] for Microsoft(R) .NET Framework 4.0
[windowsazurepackage] Copyright c Microsoft Corporation. All rights reserved.
[windowsazurepackage] D:\opt\workspace\HelloAzure\ServiceDefinition.csdef: Warning  CloudServices040 : The 'schemaVersion' attribute is unspecified. Please set the attribute to avoid this warning.

このように必要な場合はソースを修正して動作を確認することがご理解いただけたと思う。

*1:ここの pom.xml は公開してほしいところ

*2: Executing 行の ... 部分が気になったので処理を追加したが、特に見切れてたのはなさそう