日々常々

ふつうのプログラマがあたりまえにしたいこと。

Mavenさんの代わりにGradleさんを使ったら依存解決で

ハマることがあるかも。と言うか私以外にもハマった人が居たので、書いておきます。
なお、ここではgradle1.9、jersey1.17.1を使っています。他のバージョンは知らない。

お話

「時代はJAX-RSなので素振りでもしてみよう」と思いたちますよね。そしたら「backpaper0 JAX-RS」とかでググりますよね?

で。これを見ながらもpom.xmlなんて書いてられないので、「時代はGradleだ」と思ってbuild.gradleを書きますよね?

apply plugin: 'java'

repositories.mavenCentral()

dependencies {
  compile 'com.sun.jersey:jersey-bundle:1.17.1'
  testCompile 'com.sun.jersey.jersey-test-framework:jersey-test-framework-http:1.17.1'
}

こんな感じで。で、写経を進めると「JerseyTestが無い!」とかキレられるわけですよ。困っちゃいますね。

状況把握

ところでMavenだと上手く行くらしい。なので、MavenとGradleでそれぞれ比較してみよう。

Maven
% mvn dependency:tree
(略)
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ test ---
[INFO] org.hogedriven:test:jar:1.0-SNAPSHOT
[INFO] +- com.sun.jersey:jersey-bundle:jar:1.17.1:provided
[INFO] |  \- javax.ws.rs:jsr311-api:jar:1.1.1:provided
[INFO] \- com.sun.jersey.jersey-test-framework:jersey-test-framework-http:jar:1.17.1:test
[INFO]    \- com.sun.jersey.jersey-test-framework:jersey-test-framework-core:jar:1.17.1:test
[INFO]       +- javax.servlet:javax.servlet-api:jar:3.0.1:test
[INFO]       +- junit:junit:jar:4.8.2:test
[INFO]       +- com.sun.jersey:jersey-servlet:jar:1.17.1:test
[INFO]       |  \- com.sun.jersey:jersey-server:jar:1.17.1:test
[INFO]       |     \- asm:asm:jar:3.1:test
[INFO]       \- com.sun.jersey:jersey-client:jar:1.17.1:test
[INFO]          \- com.sun.jersey:jersey-core:jar:1.17.1:test
(略)
Gradle
% gradle dependencies
(略)
testRuntime - Runtime classpath for source set 'test'.
+--- com.sun.jersey:jersey-bundle:1.17.1
|    \--- javax.ws.rs:jsr311-api:1.1.1
\--- com.sun.jersey.jersey-test-framework:jersey-test-framework-http:1.17.1
(略)

見ての通り、Gradleだと思いっきり足りない。

原因調査

色々すっ飛ばして。
jersey-test-framework-httpのpomを見ると、jersey-test-framework-coreへの依存がprofileになってる。activeByDefault=trueなんで、Mavenだと入るんだろうね。Gradleはこれ見れないぽい。つらい。

場当たり対処

jersey-test-framework-core足しとくか……。

dependencies {
  compile 'com.sun.jersey:jersey-bundle:1.17.1'
  testCompile 'com.sun.jersey.jersey-test-framework:jersey-test-framework-http:1.17.1'
  testCompile 'com.sun.jersey.jersey-test-framework:jersey-test-framework-core:1.17.1'
}
testRuntime - Runtime classpath for source set 'test'.
+--- com.sun.jersey:jersey-bundle:1.17.1
|    \--- javax.ws.rs:jsr311-api:1.1.1
+--- com.sun.jersey.jersey-test-framework:jersey-test-framework-http:1.17.1
\--- com.sun.jersey.jersey-test-framework:jersey-test-framework-core:1.17.1
     +--- javax.servlet:javax.servlet-api:3.0.1
     \--- junit:junit:4.8.2

……未だ足りないですかそうですか。(うらがみさんのチュートリアルコンパイル通って動くようになるっぽいけど)
jersey-test-framework-coreのpomを見てみると、jersey-servletとjersey-clientが同様にprofileになってる。
この辺になってくると楽したくてGradle使ってたはずが本末転倒になってきますね。やれやれ。

まーよくある話なので

GradleのJIRAにもあります。

って言うか(追記)

自分で書いてたwww