无法使用groovy注释中类中定义的变量

无法使用groovy注释中类中定义的变量,groovy,annotations,gradle,Groovy,Annotations,Gradle,我试图将Dropwizard示例中的一些代码从java移植到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

我试图将Dropwizard示例中的一些代码从java移植到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),该类无法编译,因为MediaType.APPLICATION_JSON周围存在noClassFoundException

如果我更改此代码以使用实际字符串值

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

}
一切都很完美

groovy解析注释的方式与java解析注释的方式有什么不同吗

为了完整起见,这是gradle项目的一部分,下面是我的build.gradle(文件位于src/groovy/com/example/helloworld下)

编译错误是:

原因:java.lang.RuntimeException: java.lang.ClassNotFoundException: com.sun.ws.rs.ext.RuntimeDelegateImpl。。。又有17人因以下原因而受伤: java.lang.ClassNotFoundException: com.sun.ws.rs.ext.RuntimeDelegateImpl位于 org.gradle.api.internal.tasks.compile.TransformingClassLoader.findClass(TransformingClassLoader.java:47)


这个问题是由Groovy编译器的一个不幸的限制引起的,即它使用反射来访问编译类路径上的类。这可能反过来触发加载其他类,而这些类在编译类路径上可能不可用。通常(但不总是)这些是运行时依赖项

在具体的例子中,Groovy编译器通过反射加载
javax.ws.rs.core.MediaType
,最终导致
com.sun.ws.rs.ext.RuntimeDelegateImpl
通过
Class.forName
(由静态初始值设定项触发)加载,而
不在编译类路径上。解决方案是将该类放在编译类路径上。(从长远来看,解决方案是修复独立Groovy编译器不使用反射,据我所知,这已经在队列中了。)如果模块的可传递依赖关系不是问题,实现这一点的最简单方法是:

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

我怀疑EclipseGroovy编译器没有这个问题,因为它没有使用反射来访问编译类路径。我预计GMaven会像Gradle一样爆炸,除非它被配置为使用Eclipse编译器(Gradle目前不支持该编译器)。

它能与
@products(javax.ws.rs.core.MediaType.APPLICATION\u JSON)一起工作吗,它不是——但是这个错误让我认为它可能是一个gradle的东西,而不是groovy的东西似乎是一个gradle的bug,因为我能够使用groovy eclipse和maven编译相同的东西。
dependencies {
    compile "com.sun.jersey:jersey-client:1.15" 
}