2013-01-21 25 views
5

Tôi đang cố gắng chuyển một số mã từ các ví dụ Dropwizard từ java sang groovy.Không thể sử dụng các biến được xác định trong các lớp trong chú thích groovy

Tôi thấy rằng trong java, tôi có thể sử dụng đoạn mã sau mà không cần bất kỳ vấn đề:

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

@Produces(MediaType.APPLICATION_JSON) 
public class HelloWorldService{ 

} 

Tuy nhiên, với trình biên dịch groovy (cả 1.8 và 2.0.6), lớp không biên dịch với một noClassFoundException xung quanh MediaType.APPLICATION_JSON

Nếu tôi thay đổi mã này để sử dụng các chuỗi giá trị thực tế

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

} 

mọi thứ hoạt động hoàn hảo.

Có bất kỳ sự khác biệt nào giữa cách thức giải quyết các chú thích và cách thức java thực hiện?

Để hoàn chỉnh, đây là một phần của một dự án gradle và đây là build.gradle của tôi (tập tin đi dưới src/groovy/com/example/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' 
} 

Các lỗi biên dịch là:

Nguyên nhân: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.sun.ws.rs.ext.RuntimeDelegateImpl ... 17 hơn gây ra bởi: java.lang.ClassNotFoundException: com. sun.ws.rs.ext.RuntimeDe legateImpl tại org.gradle.api.internal.tasks.compile.TransformingClassLoader.findClass (TransformingClassLoader.java:47)

+0

Tính năng này có hoạt động với '@Sản phẩm (javax.ws.rs.core.MediaType.APPLICATION_JSON)' –

+0

Không, nó không --- nhưng lỗi khiến tôi nghĩ rằng đó có thể là một điều tốt nghiệp hơn là một câu cá điều –

+0

dường như là lỗi từ khi tôi có thể biên dịch mẫu bằng cách sử dụng công cụ tìm kiếm và làm mờ. –

Trả lời

6

Vấn đề là do một hạn chế đáng tiếc của trình biên dịch Groovy, cụ thể là nó sử dụng phản ánh để truy cập các lớp trên đường dẫn lớp biên dịch. Điều này có thể lần lượt kích hoạt các lớp khác để được tải, có thể không có sẵn trên đường dẫn lớp biên dịch. Thông thường (nhưng không phải luôn luôn) đây là những phụ thuộc thời gian chạy.

Trong trường hợp cụ thể, trình biên dịch Groovy tải javax.ws.rs.core.MediaType qua phản ánh, kết quả cuối cùng là com.sun.ws.rs.ext.RuntimeDelegateImpl được tải qua Class.forName (được kích hoạt bởi bộ khởi tạo tĩnh), không nằm trên đường dẫn lớp biên dịch. Giải pháp là đặt lớp đó trên đường dẫn lớp biên dịch. (Trong thời gian dài hơn, giải pháp là sửa trình biên dịch Groovy độc lập không sử dụng sự phản chiếu, và từ những gì tôi biết điều này đã có trong hàng đợi.) Nếu phụ thuộc transitive của mô-đun của bạn không phải là một vấn đề, cách đơn giản nhất để đạt được điều này là:

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

Tôi nghi ngờ trình biên dịch Groovy Eclipse không có vấn đề này bởi vì nó không sử dụng sự phản chiếu để truy cập đường dẫn lớp biên dịch. Tôi hy vọng GMaven sẽ nổ tung như Gradle, trừ khi nó được cấu hình để sử dụng trình biên dịch Eclipse (hiện không được Gradle hỗ trợ).