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使ってたはずが本末転倒になってきますね。やれやれ。