2012-01-19 20 views
7

Ci sono un sacco di domande come questa. Ne ho analizzati la maggior parte ma nessuno in realtà, ma non sono riuscito a trovare una risposta:perché questo codice viene compilato con il compilatore eclipse ma non con javac (maven)

Ho uno strano problema in una delle mie classi GWT/GWTP.
La classe viene compilata correttamente con il compilatore Eclipse ma non riesce con il compilatore 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 
} 

Quando provo a compilare con Maven ottengo l'errore seguente:

cannot find symbol symbol: class View

Vista riferisce all'interfaccia View nel pacchetto com.gwtplatform.mvp.client.

Ho altre classi che sembrano uguali e funzionano bene.
La cosa strana è che se cambio l'ordine delle importazioni o specifico il pacchetto esatto dell'interfaccia View, esso compila senza problemi in Maven.
Per essere precisi ho spostato l'importazione per com.gwtplatform.mvp.client.View

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

Ho avuto un problema simile qualche tempo fa con il problema di successione ciclica tra le classi che fanno riferimento a classi interne (ha lavorato in Eclipse, ma non in javac). Tuttavia non sono sicuro che sia lo stesso problema.

+1

Non sono sicuro della causa principale dei problemi, ma le interfacce interne non sono molto carine e possono portare a confusioni sulla provenienza delle dipendenze. – AndyT

+0

Hai ragione e presumo che spostare l'interfaccia fuori dalla classe lo risolvesse (difficile non l'ho verificato). Ero solo curioso di sapere quale potrebbe essere la spiegazione di questo strano comportamento (spostarsi tra le importazioni fa compilare o meno il codice) –

risposta

8

Il compilatore di Eclipse è in realtà un compilatore diverso rispetto al compilatore javac. A volte si allontanano nel comportamento, di solito si riconciliano rapidamente.

Questo è stato molto evidente quando i generici di Java sono usciti. Ci sono stati casi in cui Eclipse ha riscontrato un difetto con una direttiva sui generics che javac avrebbe permesso o che javac ha trovato in errore con i generici consentiti da eclipse (non ricordo in quale modo si sia allontanato troppo, troppo tempo fa). In entrambi i casi, è più probabile che javac sia l'implementazione corretta.

Nel tuo caso, inquini lo spazio dei nomi con i tuoi riferimenti generici a una classe interiore. Le probabilità sono che Eclipse stia raggiungendo la "vista" in un ordine di priorità diverso rispetto a javac. Le probabilità sono eccellenti che Javac implementa l'ordine in quanto è specificato nelle linee guida del linguaggio Java, o le linee guida Java non hanno ancora pronunciato "l'unico vero ordine" di risoluzione delle classi con nome in conflitto. Normalmente questo non è un problema perché non è consentito utilizzare lo stesso nome non completo in Java due volte; tuttavia, con le classi interne le specifiche possono essere "aggirate".

vorrei fare il bind

public interface MyView extends View { 


} 

ad appena un punto di vista (non so se com.gwtplatform.mvp.client.View o MyPresenter.View è quella giusta), facendo il nome esplicito.

public interface MyView extends MyPresenter.View { 


} 

o

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


} 

questo modo di non cadere vittima l'interfaccia "vincolante" per il tipo sbagliato in modo compilatore-dipendente.

+0

Wow. Mi sono bloccato su questo problema durante la conversione di un progetto Java da "nothing-just-hit-compile-in-Eclipse" a Maven. Il compilatore Java si lamenta di un simbolo mancante che non manca, quindi trovare la causa di questo problema è complicato. Riferimento alle classi inner-inner da una classe esterna come Inner.Inner funziona, ma Inner con un'importazione per Outer.Inner.Inner funziona solo in Eclipse, non da Maven. Grazie! – JeroenHoek

Problemi correlati