2012-01-19 82 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

相关问题