MavenでWebDAV経由でファイルアップロードしたい

のです。

何でこんなことを思い立ったかというと、「Backlogファイル共有に成果物を配置する」手順をビルドスクリプトに組み込みたかったからです。開発者以外の方と成果物といったソースコード以外の資料を共有するのに、ファイル共有は便利なんですよね。


試したのは2つのプラグイン。

wagon-maven-plugin

検索しても"mvn deploy"時の話しか出てこなかったので、単純にファイルアップロードには使えないのかな思ってました。冷静に考えてそんなはずないですよね、まず公式ドキュメント嫁って話…orz

設定方法は、404 shin1のつぶやき ないわー Not Found: ビルド結果のファイルを別のマシンへ転送する(maven, Hudson)を参考に。pom.xmlのプラグインの設定は、こんな感じで。Backlogの(スペース名:demo / プロジェクト名:STWK)のファイル共有部にWebDAVアップロードするものとします。

...
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>wagon-maven-plugin</artifactId>
	<configuration>
		<serverId>backlog</serverId>
		<url>dav:https://demo.backlog.jp/dav/STWK</url>
		<fromDir>target</fromDir>
		<includes>${build.finalName}.jar</includes>
		<toDir>deploy</toDir>
	</configuration>
	<executions>
		<execution>
			<id>upload</id>
			<phase>package</phase>
			<goals>
				<goal>upload</goal>
			</goals>
		</execution>
	</executions>
</plugin>
...

.m2/settings.xmlで、ユーザ/パスワードの情報を記載。pom中のと紐付けます。

...
<server>
	<id>backlog</id>
	<username>demo</username>
	<password>demo</password>
</server>
...
  • TOPディレクトリにアップロードできない?

上記の通りにやればできるのですが、1点だけ気になったことが。Backlogのファイル共有で、なぜかTOPディレクトリにアップロードできませんでした。ローカルにTomcatWebDAVサーバを立てて試すとうまくいったんですけどね…。

まぁ、これはそこまで大きい問題ではないですが。TOPディレクトリに直にファイルを置かずとも、ディレクトリを作って階層構造で管理すればいいだけですし。

webdav-maven-plugin


webdavmaven.tigris.org
を見つけたので、wagon-pluginの前にこっちを試しました。結論から言うと、微妙。選択肢がないなら仕方ないですが、wagon pluginが使える以上は現状こっちを選ぶ必要性はあまりないかと思います。

なお、このプラグインは現状ではいくつか制限があります。こういったハードルの高さも、選択肢から外れる一因かな。

  • 公開リポジトリ経由でインストールできない
  • HTTPSがサポートされていない
  • テキストファイルしかサポートされていない

1点目は、リポジトリをチェックアウトしてきて、"mvn install"なり"mvn deploy"なりで手動でインストールする。その際、私のwindows環境ではパス関係やintegration-testでこけるところがあったので、POMの該当部分をコメントアウトしてなおかつテストをスキップさせて実行しました。

2点目は、ソースコードを直接いじってやります。

  • 修正箇所:org.tigris.webdavmaven.mojo.WebdavData#getDestinationPort()
  • 修正内容:HTTPS通信時にorg.apache.commons.httpclient.HttpURLの代わりに、HttpsURLを使うように切り替える

切り替えは、べたにこんな感じで。

String scheme = new URI(getDestinationUrl(), false).getScheme();

if (scheme.equals("http")) {
	return new HttpURL(getDestinationUrl());
} else if (scheme.equals("https")) {
	return new HttpsURL(getDestinationUrl());
} else {
	throw new MojoExecutionException("Not supported schema.");
}

ただ、最後の問題は解決できていません。さすがに、バイナリファイルが対象外だと実用性に欠けます…orz

一応、POMの設定方法も合わせて載せておきますよと。

<plugin>
	<groupId>org.tigris.webdavmaven</groupId>
	<artifactId>webdav-maven-plugin</artifactId>
	<version>0.4.0</version>

	<configuration>
		<!-- Give name and password for accessing your Webdav server. -->
		<webdav-user>demo</webdav-user>
		<webdav-password>demo</webdav-password>

		<!--
			Note: The files which are to be written by the Webdav plugin must
			already exist on the server.
		-->
		<!-- Give an arbitrary number of 'webdav-data' elements here.-->
		<webdavWriters>
			<webdav-data>
				<contentFile>src/test/resources/webdav-maven-plugin_test.txt</contentFile>
				<destinationUrl>https://demo.backlog.jp/dav/STWK/webdav-maven-plugin_test.txt</destinationUrl>
			</webdav-data>
		</webdavWriters>

		<appendMark>false</appendMark>
	</configuration>

	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>write</goal>
			</goals>
		</execution>
	</executions>
</plugin>


結論を言えば、wagon-maven-pluginで十分だということですね。追加でこんなこともやれたらいいなぁと思っています。

  1. 現在日付をPOM中で取得して
  2. その日付をディレクトリ名として、ディレクトリ配下にアップロードする

どうやればいいのかな?maven-groovy-pluginでやってやればいけそうな気はしてますが…