2012-01-19 36 views
7

Có một loạt các câu hỏi như thế này. Tôi đã đi qua hầu hết trong số họ nhưng không ai thực sự nhưng tôi không thể đưa ra bất kỳ câu trả lời:tại sao mã này biên dịch với trình biên dịch eclipse nhưng không phải với javac (maven)

Tôi có một vấn đề lạ ở một trong các lớp GWT/GWTP của tôi.
Lớp biên dịch tốt với trình biên dịch Eclipse nhưng không thành công với trình biên dịch javac (Maven).

//additional imports 
import com.gwtplatform.mvp.client.PresenterWidget; 
import com.gwtplatform.mvp.client.View; 

public class MyPresenter extends PresenterWidget<MyPresenter.MyView> { 

    public interface MyView extends View { 


    } 

    some code 
} 

Khi tôi cố gắng để biên dịch với maven tôi nhận được lỗi sau:

cannot find symbol symbol: class View

Xem đề cập đến giao diện View trong gói com.gwtplatform.mvp.client.

Tôi có các lớp khác trông giống nhau và hoạt động tốt.
Điều kỳ lạ là nếu tôi thay đổi thứ tự nhập khẩu hoặc tôi chỉ định gói chính xác của giao diện View nó biên dịch mà không có bất kỳ vấn đề nào trong maven.
Để cụ thể tôi chuyển việc nhập khẩu cho com.gwtplatform.mvp.client.View

import com.gwtplatform.mvp.client.View; 
//additional imports 
import com.gwtplatform.mvp.client.PresenterWidget; 

Tôi đã có một vấn đề tương tự một số thời gian trước đây với vấn đề thừa kế theo chu kỳ giữa các lớp mà tham khảo các lớp bên trong (làm việc tại nhật thực nhưng không trong javac). Tuy nhiên tôi không chắc chắn nếu đó là cùng một vấn đề.

+1

Không chắc chắn về nguyên nhân gốc rễ của vấn đề của bạn, nhưng giao diện bên trong không phải là rất đẹp và có thể dẫn đến nhầm lẫn về nơi phụ thuộc của bạn đến từ đâu. – AndyT

+0

Bạn nói đúng và tôi cho rằng việc di chuyển giao diện ra khỏi lớp sẽ khắc phục nó (khó khăn mà tôi chưa xác minh nó). Tôi đã chỉ tò mò những gì có thể là lời giải thích cho hành vi kỳ lạ này (di chuyển xung quanh nhập khẩu gây ra mã để biên dịch hay không) –

Trả lời

8

Trình biên dịch của Eclipse thực sự là một trình biên dịch khác với trình biên dịch javac. Đôi khi họ trôi dạt trong hành vi, thường họ hòa giải nhanh chóng.

Điều này rất đáng chú ý khi các generics của Java xuất hiện. Có trường hợp nhật thực hoặc tìm thấy lỗi với một chỉ thị generics mà javac sẽ cho phép hoặc javac tìm thấy lỗi với generics eclipse sẽ cho phép (không thể nhớ cách nào nó trôi xa nhau, quá lâu trước đây). Trong cả hai trường hợp, javac có nhiều khả năng là việc triển khai chính xác hơn.

Trong trường hợp của bạn, bạn gây ô nhiễm không gian tên với tham chiếu generics của bạn đến lớp bên trong. Tỷ lệ là nhật thực đang đạt cho "Xem" theo thứ tự ưu tiên khác với javac. Tỷ lệ cược là tuyệt vời mà Javac thực hiện thứ tự như nó được chỉ định trong các nguyên tắc ngôn ngữ Java, hoặc các nguyên tắc Java vẫn chưa phát âm "một thứ tự đúng" của việc giải quyết các lớp giống nhau được đặt tên xung đột. Thông thường đây không phải là vấn đề bởi vì nó không được phép sử dụng cùng một tên không đủ điều kiện trong Java hai lần; tuy nhiên, với các lớp bên trong, các chi tiết kỹ thuật có thể là loại "làm việc xung quanh".

tôi sẽ làm cho các ràng buộc

public interface MyView extends View { 


} 

để chỉ một cái nhìn (không biết nếu com.gwtplatform.mvp.client.View hoặc MyPresenter.View là một trong những quyền) bằng cách làm cho tên rõ ràng.

public interface MyView extends MyPresenter.View { 


} 

hoặc

public interface MyView extends com.gwtplatform.mvp.client.View { 


} 

Bằng cách đó bạn không trở thành nạn nhân đến giao diện "ràng buộc" với loại sai một cách biên dịch phụ thuộc.

+0

Wow. Tôi đã bị mắc kẹt về vấn đề này trong quá trình chuyển đổi một dự án Java từ 'không-chỉ-hit-biên dịch-trong-Eclipse' sang Maven. Trình biên dịch Java phàn nàn về một biểu tượng bị thiếu mà không bị thiếu, vì vậy việc tìm nguyên nhân của vấn đề này là khó khăn. Đề cập đến các lớp bên trong bên trong từ một lớp bên ngoài như Inner.Inner hoạt động, nhưng bên trong với một nhập khẩu cho Outer.Inner.Inner chỉ hoạt động trong Eclipse, không phải từ Maven. Cảm ơn! – JeroenHoek

Các vấn đề liên quan