[Maven2] リモートリポジトリへのファイルの deploy

最新のライブラリが公開されているリポジトリに登録されていなかったり、ライセンスの関係上公開されていないものがあるので、社内リポジトリを構築することにした。

サーバ側は Apache で mod_dav と mod_dav_fs を入れて WebDAV を有効にするだけ(ここでは認証は省略)。

<Location "/maven2">
  DAV on
</Location>

で、さっそく deploy しようとしてみた。

mvn deploy:deploy-file -Durl=http://xxx.xxx/maven2 \
                       -DrepositoryId=xxx \
                       -Dfile=./baz-1.2.3.jar \
                       -DgroupId=foo \
                       -DartifactId=bar \
                       -Dversion=1.2.3 \
                       -Dpackaging=jar

するとエラーがでる。

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error deploying artifact: Authorization failed: Access denied to: http://xxx.xxx/maven2/foo/bar/1.2.3/baz-1.2.3.jar

Authorization failed って何や!認証なんかかけてないやんけ!と思ってサーバのログを見ると、ディレクトリ階層の深いところにいきなりファイルを PUT していて、ディレクトリが無いのでエラーになっている様子。不親切なエラーメッセージだ。試しにサーバ側であらかじめディレクトリを作っておくとうまくいく。

なんか納得いかないのでもうちょっと調べてみると、「dav:http:」というプロトコルを指定をすれば良いらしいことがわかった。で、やってみるとそんなプロトコル知らんといわれた。maven の出力を見ると、どうも plugin のダウンロードがうまくいってないっぽい。

Downloading: http://repo1.maven.org/maven2/test/wagon-http-shared/1.0-beta-2/wagon-http-shared-1.0-beta-2.pom

test なんてディレクトリないし。仕方ないので、pom.xml を作って明示的に extension を指定してみた。

<?xml version="1.0" encoding="UTF-8"?>
<project>
  ...
  <build>
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-webdav</artifactId>
        <version>1.0-beta-2</version>
      </extension>
    </extensions>
  </build>
</project>

これでようやくうまくいった。

mvn deploy:deploy-file -Durl=dav:http://xxx.xxx/maven2 \
                       -DrepositoryId=xxx \
                       -Dfile=./baz-1.2.3.jar \
                       -DgroupId=foo \
                       -DartifactId=bar \
                       -Dversion=1.2.3 \
                       -Dpackaging=jar

Apache のログを見ると、ちゃんと MKCOL コマンドでディレクトリが作成していることがわかる。

"MKCOL /maven2/ HTTP/1.1" 405 433 "-" "Jakarta Commons-HttpClient/2.0.2"
"MKCOL /maven2/foo/ HTTP/1.1" 201 391 "-" "Jakarta Commons-HttpClient/2.0.2"
"MKCOL /maven2/foo/bar/ HTTP/1.1" 201 395 "-" "Jakarta Commons-HttpClient/2.0.2"
"MKCOL /maven2/foo/bar/1.2.3/ HTTP/1.1" 201 401 "-" "Jakarta Commons-HttpClient/2.0.2"
"PUT /maven2/foo/bar/1.2.3/bar-1.2.3.jar HTTP/1.1" 201 412 "-" "Jakarta Commons-HttpClient/2.0.2"

やれやれ。