2013-01-21 6 views
5

JavaからGroovyへのDropwizardのコードからいくつかのコードを移植しようとしています。Groovyのアノテーション内のクラスで定義された変数を使用できません

私は、Javaの中に、私は何の問題もなく、次のコードを使用することができていることがわかり

package com.example.helloworld; 
import javax.ws.rs.*; 
import javax.ws.rs.core.MediaType; 

@Produces(MediaType.APPLICATION_JSON) 
public class HelloWorldService{ 

} 

しかし、Groovyのコンパイラ(1.8と2.0.6の両方)で、クラスはnoClassFoundExceptionでコンパイルに失敗します

MediaType.APPLICATION_JSON

周りに私は

@Produces('application/json') 
public class HelloWorldService{ 

} 

実際の文字列値を使用するには、このコードを変更した場合、すべてが完璧に動作します。

Groovyがアノテーションを解決する方法とJavaのやり方に違いはありますか?

完全を期すため、これはGradleのプロジェクトの一部であり、ここで私のbuild.gradleです(ファイルはSRC /グルーヴィー/ COM /例/ helloworldの下に行く)

apply plugin: 'groovy' 

// Set our project variables 
project.ext { 
    dropwizardVersion = '0.6.1' 
} 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile group: 'com.yammer.dropwizard', name: 'dropwizard-core', version: dropwizardVersion 
    groovy group: 'org.codehaus.groovy', name: 'groovy-all', version: '1.8.7' 
} 

コンパイルエラーがある:

java.lang.RuntimeException:によって引き起こさ

にjava.lang.ClassNotFoundException: にjava.lang.ClassNotFoundException: COM以上に起因する com.sun.ws.rs.ext.RuntimeDelegateImpl ... 17。 sun.ws.rs.ext.RuntimeDe org.gradle.api.internal.tasks.compile.TransformingClassLoader.findClass(TransformingClassLoader.java:47)

+0

'@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON) 'で動作しますか? –

+0

いいえ、それはありません---しかし、エラーは私がそれがgroovyではなく、私がgroovy-eclipseとmavenを使って何かをコンパイルできるので、 –

+0

はgradleのバグのようです。 –

答えて

6

問題は、それが反射を使用すること、すなわち、グルービーコンパイラの不幸な制限によって引き起こされるでlegateImplコンパイルクラスパス上のクラスにアクセスします。これにより、他のクラスがロードされることがあります。これはコンパイルクラスパスでは使用できない場合があります。一般的に(常にではありませんが)、これらはランタイム依存です。コンパイル・クラス・パス上にない最終的com.sun.ws.rs.ext.RuntimeDelegateImplが(静的イニシャライザによってトリガ)Class.forNameを介してロードされることになる反射を介してコンクリート場合

、グルービーコンパイラ負荷javax.ws.rs.core.MediaType。解決策は、そのクラスをコンパイルクラスパスに置くことです。 (長期的には、スタンドアロンのGroovyコンパイラがリフレクションを使用しないように修正し、これが既にキューに入っていることを知っているからです)。モジュールの推移的な依存性が問題でない場合、これを達成する最も簡単な方法次のとおりです。

dependencies { 
    compile "com.sun.jersey:jersey-client:1.15" 
} 

私はそれがコンパイルクラスパスにアクセスするためにリフレクションを使用していないため、EclipseのGroovyのコンパイラは、この問題を持っていないと思われます。 GMavenがEclipseコンパイラ(現在Gradleでサポートされていない)を使用するように設定されていない限り、GMavenはGradleのように爆発するだろうと思う。

関連する問題