2012-01-19 96 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 
} 

當我嘗試使用Maven編譯我得到以下錯誤:

cannot find symbol symbol: class View

查看是指在com.gwtplatform.mvp.clientView接口。

我有其他類看起來相同,工作正常。
奇怪的是,如果我改變進口的順序,或者我指定它的接口的確切包,它編譯沒有任何問題在maven中。
具體地說,我搬到了進口的com.gwtplatform.mvp.client.View

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

我有一個類似的問題,前一段時間有循環繼承問題,這是指內部類(在Eclipse中工作,但並沒有javac的)類之間。但是我不確定這是否是同樣的問題。

+1

不確定問題的根本原因,但內部接口不是很漂亮,並可能導致您的依賴關係來自何處的混淆。 – AndyT

+0

你是對的,我認爲將界面移出課程會解決它(難以辨認)。我只是好奇什麼可能是這種奇怪的行爲的解釋(移動導入導致代碼編譯或不) –

回答

8

Eclipse的編譯器實際上是與javac編譯器不同的編譯器。有時他們在行爲上分開,通常他們會很快和解。

當Java的泛型出現時,這是非常明顯的。在有些情況下,eclipse要麼發現javac允許的泛型指令,要麼發現javac發現eclipse允許的泛型錯誤(不能記得它過早分開的方式)。無論哪種情況,javac更可能是正確的實現。

在你的情況,你污染了你的泛型引用一個內部類的命名空間。可能性是日食以不同於javac的優先順序到達「視圖」。 Javac語言指南中指定的順序或Java指導方針尚未宣佈解決衝突的類命名類的「單一順序」的可能性非常好。通常這不是問題,因爲不允許在Java中使用相同的非完全限定名稱兩次;但是,對於內部類,規範可以是「解決方法」。

我會使

public interface MyView extends View { 


} 

綁定至一個視圖(不知道是不是com.gwtplatform.mvp.client.ViewMyPresenter.View是正確的),通過使名稱明確。

public interface MyView extends MyPresenter.View { 


} 

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


} 

這樣,你不犧牲品界面中的「結合」到錯誤類型的編譯器依賴性。

+0

哇。在Java項目從'沒有命中編譯到Eclipse'轉換爲Maven的過程中,我遇到了這個問題。 Java編譯器抱怨缺少一個缺失的符號,因此找到這個問題的原因很棘手。 從外部類引用inner inner內部類作爲Inner.Inner工作,但內部用Outer.Inner.Inner的導入只能在Eclipse中工作,而不能在Maven中工作。 謝謝! – JeroenHoek

相關問題