2012-01-19 5 views
7

이렇게 많은 질문이 있습니다. 나는 대부분을 통과했지만 아무도 실제로 대답을하지 못했습니다. 어떤 대답도 찾을 수 없었습니다.이 코드는 Eclipse 컴파일러로 컴파일되지만 javac (maven)으로 컴파일되지 않습니다.

GWT/GWTP 클래스 중 하나에서 이상한 문제가 있습니다.
클래스는 Eclipse 컴파일러로는 잘 컴파일되지만 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 
} 

나는이 오류 다음 얻을 받는다는 컴파일하려고

:

cannot find symbol symbol: class View

보기com.gwtplatform.mvp.client 패키지의 View 인터페이스를 의미합니다.

나는 똑같아 보이고 잘 동작하는 다른 클래스가 있습니다.
이상한 점은 가져 오기 순서를 변경하거나 View 인터페이스의 정확한 패키지를 지정하면 maven에서 문제없이 컴파일된다는 것입니다.
는 구체적으로 나는 내부 클래스를 참조 (일식에서 일하지만 javac의하지 않았다) 클래스 사이의 순환 상속 문제로 몇 시간 전에 비슷한 문제가 있었다 com.gwtplatform.mvp.client.View

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

에 대한 가져 오기를 옮겼습니다. 그러나 그것이 동일한 문제인지 확실하지 않습니다.

+1

문제의 근본 원인에 대해 잘 모르겠지만 내부 인터페이스가 그리 좋지 않아서 종속성이 어디서 오는지에 대한 혼동을 야기 할 수 있습니다. – AndyT

+0

맞습니다. 클래스 외부로 인터페이스를 이동하면 문제가 해결 될 것이라고 생각합니다. 힘들었습니다. 확인하지 않았습니다. 나는이 이상한 행동에 대한 설명이 무엇인지 궁금해했다. (수입 주위를 돌아 다니면 코드가 컴파일되거나되지 않는다.) –

답변

8

Eclipse의 컴파일러는 실제로 javac 컴파일러와 다른 컴파일러입니다. 때때로 그들은 행동에서 떨어져 표류하고, 보통 그들은 조화를 이룹니다.

이것은 Java의 제네릭이 나왔을 때 매우 주목할 만했습니다. 이클립스는 javac이 허용하는 generics 지시어로 오류를 발견하거나 Eclipse가 허용하는 generics (javac가 너무 오래 전에 어떤 식으로 떠내려 왔는지 기억할 수 없음)에서 오류를 발견 한 경우가있었습니다. 두 경우 모두 javac이 올바른 구현 일 가능성이 큽니다.

귀하의 경우 내부 클래스에 대한 제네릭 참조를 사용하여 네임 스페이스를 오염시킵니다. 확률은 일식이 javac보다 다른 우선 순위로 "보기"에 도달한다는 것입니다. Javac이 Java 언어 지침에 명시된대로 순서를 구현하거나 Java 지침이 충돌하는 유사한 이름의 클래스를 해결하기위한 "하나의 진정한 순서"를 아직 선언하지 않은 것은 탁월합니다. 일반적으로 Java에서 동일한 정규화되지 않은 이름을 두 번 사용하는 것이 허용되지 않기 때문에 이는 문제가되지 않습니다. 그러나 내부 클래스를 사용하면 사양이 "일할"수 있습니다.

나는 이름이 명시함으로써 (com.gwtplatform.mvp.client.View 또는 MyPresenter.View이 올바른 경우 모르는) 하나의보기로

public interface MyView extends View { 


} 

바인딩을 만들 것입니다.

public interface MyView extends MyPresenter.View { 


} 

또는

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


} 

당신이 컴파일러 의존적으로 잘못된 유형에 "바인딩"인터페이스에 희생자가되지 않는 방법입니다.

+0

와우. Java 프로젝트를 'Eclipse에서 아무것도 컴파일하지 않는다'에서 Maven으로 변환하는 중에이 문제에 봉착했습니다. Java 컴파일러는 누락 된 기호가 누락되어 불평하므로이 문제의 원인을 찾는 것이 까다 롭습니다. 외부 클래스의 내부 내부 클래스를 Inner.Inner로 참조하지만 Outer.Inner.Inner에 대한 가져 오기가있는 내부는 Eclipse에서만 작동하며 Maven에서는 작동하지 않습니다. 감사합니다. – JeroenHoek