2013-02-22 8 views
5

Ho appena iniziato lo sviluppo di GWT usando Maven come sistema di compilazione.Esiste una struttura di progetto GWT Maven, che non confonde le responsabilità?

Vengo dal mondo Java + Flex, quindi naturalmente ho moduli lato client e moduli lato server separati in modo pulito.

Mentre scavando nelle best practice del GWT e scavando sempre più in profondità, per me la configurazione di default dei progetti GWT sembra sempre più un totale disordine di responsabilità. Soprattutto quando si tratta di progetti multi-modulo.

Ho capito che la convenzione afferma che la logica lato server appartiene ai pacchetti "server", il codice condiviso in "condiviso" e tutto ciò che è compilato in HTML + JavaScript dal compilatore GWT in pacchetti "client". E tutto il codice va a src/main/java. Fin qui tutto bene.

Non importa come cerco di vederlo ... per me la roba nei pacchetti "client" è semplicemente un codice morto. Anche se il compilatore java lo compila in classi, le classi non vengono mai utilizzate in runtime e sono necessarie solo per fornire input al compilatore GWT nella fase di compilazione. Quindi, anche se sembra Java, in realtà non lo è e sembra solo Java. E 'un po' sporco da collocare all'interno degli stessi vasi del codice "live".

sarebbe non una struttura esperto di come questo più senso:

/src/ 
/src/main/ 
/src/main/java 
/src/main/shared 
/src/main/gwt 

E per avere l'uso java-compiler-plugin src/main/java e src/main/condivisa e il compilatore GWT da usare src/main/gwt e src/main/shared?

Inoltre sarebbe molto meglio se la build producesse due tipi di artefatti ... normali "vasi" contenenti clases da src/main/java e src/main/shared e un secondo "gwt", che contiene classi e sorgenti di src/main/gwt e src/main/shared.

Non aggiungerei una dipendenza a un contenitore misto, ma potrei decidere se voglio importare alcuni componenti GWT o se voglio importare alcune funzionalità lato server.

La prossima cosa è che il default GWT è quello di mettere XML, risorse e altre cose in src/main/java ... XML & & risorse! = Java ;-)

O c'è un vero motivo per tutto questo, che semplicemente non ho ancora capito ... o devo semplicemente cominciare a sporcarmi e non a scrivere cose del genere?

Chris

risposta

3

Ho anche cercato di separare GWT codice client-side dal codice lato server. Il metodo che ho usato è di avere un progetto di alto livello con 2 sotto-progetti, uno per lato server, uno per lato client. Il progetto di livello superiore ha un pom.xml contenente un elemento per ciascun sottoprogetto.

Il progetto sul lato client contiene il sorgente Java di GWT in src/main/java e il resto dei file webapp in src/main/webapp. Il progetto sul lato server contiene solo il codice lato server.

Probabilmente non è la soluzione più semplice, ma almeno c'è una separazione più chiara.

+0

Stavo solo discutendo uno scenario in cui avevo un Sample Singleton nel mio pacchetto server ed era facile chiamare un metodo su questo dal codice lato client. Quindi per me l'anima pulita sarebbe avere 3 progetti (client, condivisi, server) ... ma immagino che questo possa far esplodere le cose in modo drammatico. –

+0

Non mi sono mai preoccupato di condividere, non mi piace il GWT RMI, troppo confuso. Io uso solo XML per le comunicazioni client/server. GWT ha la gestione xml. – NickJ

5

Sono arrivato alla stessa conclusione qualche tempo fa e ho creato un paio di archetipi per iniziare: https://github.com/tbroyer/gwt-maven-archetypes (announcement).

Questi archetipi hanno ancora il *.gwt.xml e altri. in src/main/java, perché il plug-in di Google per Eclipse non supportava la loro collocazione da nessun'altra parte (ho sentito che è stato corretto in una versione recente ma non è stato ancora verificato).

+0

Immagino che una soluzione davvero pulita sarebbe se il plugin gwt-maven fosse esteso per fornire un tipo di pacchettizzazione personalizzato (per esempio) "gwt". All'interno di tale artefatto gwt potrei avere dipendenze dalle risorse jar e gwt e la posizione del codice predefinita sarebbe (per esempio) src/main/gwt. In questo caso non è possibile confondere pseudo-jar GWT e veri jab Java, ma potrei fare riferimento a codice Java reale da GWT. Non avrei avuto classi morte nei miei server classpath. E chiunque vedrebbe immediatamente che si tratta in realtà di codice GWT. –

+0

Sto lavorando su una cosa del genere (primo prototipo sul mio GitHub se lo vuoi). Non dovresti ancora mischiare client e server nello stesso modulo Maven (pensaci: GWT ha bisogno sia di sorgenti che di classi compilate, quindi dovresti chiamare javac, idealmente attraverso il plugin maven-compilatore, con un'altra fonte percorso -easy- e classpath come per il tuo server-side, ci sono anche incompatibilità tra alcuni componenti lato server e il compilatore GWT o DevMode, quindi ti consigliamo di separare alcuni deps come server-only e altri come condivisi; non _il modo Maven_ di fare le cose, solo dividere i moduli) –

+0

Ehi ... Sarei felice di avere le due cose separate :-) Quindi con le tue modifiche, ci sarebbe questa configurazione con artefatti gwt e artefatti vaso? Sarebbe fantastico. Ho appena dato un'occhiata al tuo repository github ... beh, questo è davvero un "primo prototipo" ;-) –

Problemi correlati