SeamFramework.orgCommunity Documentation
Weblogic 10.3 è l'ultimo server JEE5 stabile proposto da BEA. Le applicazioni Seam possono essere sviluppate e installate sui server Weblogic, e questo capitolo vi mostrerà in che modo. Ci sono alcuni problemi noti da aggirare relativi ai server Weblogic e alcune modifiche alle configurazioni che sono specifiche di Weblogic.
Innanzitutto bisogna scaricare Weblogic, installarlo e avviarlo. Quindi passeremo a parlare dell'esempio JEE5 di Seam e deigli ostacoli da superare per farlo funzionare. Dopo di ché, installeremo l'esempio JPA. Infine creeremo un'applicazione seam-gen
e la faremo girare per fornire un punto di partenza alla vostra applicazione.
Prima di tutto bisogna installare il server. Ci sono alcuni problemi non trascurabili che non sono stati affrontati nella 10.3, che tuttavia risolve alcuni di quelli discussi sotto senza dover installare le patch di BEA. E' disponibile anche il precedente rilascio, 10.0.MP1, che, tuttavia, richiede le patch di BEA per funzionare correttamente.
Weblogic 10.0.MP1
— Pagina di download
La versione 10.0.MP1 ha alcuni problemi noti con gli EJBs che usano varargs
nei propri metodi (li confonde con transient
), e non sono gli unici. Si veda Sezione 39.2.1, «I problemi di Weblogic con EJB3» per tutti i dettagli su tali problemi e per le relative soluzioni.
Weblogic 10.3
— Pagina di download
Questa è l'ultima versione stabile del server Weblogic, e quello che sarà usato negli esempi sottostanti. Questa versione ha sistemato alcuni dei malfunzionamenti relativi agli EJB che esistevano nella versione 10.0.MP1. Comunque una delle modifiche non è stata inserita in questa versione. Si veda Sezione 39.2.1, «I problemi di Weblogic con EJB3» per i dettagli, e perciò bisogna ancora usare lo speciale jar di Seam di Weblogic discusso di seguito.
jboss-seam.jar
per il supporto EJB in WeblogicA partire da Seam 2.0.2.CR2 per Weblogic è stato creato un jar speciale che non contiene il TimerServiceDispatcher
. Questo è l'EJB che usa varargs
e presenta il secondo problema relativo agli EJB. Ci troveremo ad usare questo jar per l'esempio jee5/booking
, poiché evita i noti problemi di BEA.
Ecco velocemente i passi necessari ad installare Weblogic 10.3. Per maggiori dettagli e nel caso si presentino dei problemi,vi preghiamo di consultare i documenti BEA all'indirizzo Weblogic 10.3 Doc Center . Qui verrà installata la versione RHEL 5 usando l'installazione grafica:
Si segua il link alla 10.3 indicato sopra e si scarichi la versione adatta al proprio ambiente. Sarà necessario creare un account Oracle per portare a termine l'operazione.
Può essere necessario rendere eseguibile il file server103_XX.bin
:
chmod a+x server103_XX.bin
Eseguite l'installazione:
./server103_XX.bin
Quando l'installazione grafica è caricata, bisogna impostare il percorso della home directory di BEA. Questo è il punto dove sono installate tutte le applicazioni BEA. In questo documento tale punto sarà identificato con $BEA_HOME
, ad esempio:
/jboss/apps/bea
Come tipo di installazione bisogna selezionare Complete
. Non c'è bisogno di tutti gli extra dell'installazione competa (come le librerie struts e beehive), ma non farà alcun male.
Nella pagina successiva è possibile lasciare i valori predefiniti delle posizioni di installazione dei componenti.
Un dominio Weblogic è simile ad una configurazione del server JBoss - è un'istanza autosufficiente del server. Il server Weblogic appena installato ha alcuni domini di esempio, ma noi ne creeremo uno apposito per gli esempi di Seam. Se si vuole, è possibile usare i domini esistenti (modificando le istruzioni opportunamente).
Avviare il wizard di configurazione di Weblogic:
$BEA_HOME/wlserver_10.3/common/bin/config.sh
Si scelga di creare un nuovo dominio, configurato per supportare Weblogic Server
. Tenete presente che questa è l'opzione predefinita per il dominio.
Impostate un utente ed una password per questo dominio.
Quindi si scelga Development Mode
e il JDK predefinito quando richiesto.
La schermata successiva chiede se si vuole personalizzare qualche proprietà. Bisogna selezionare No
.
Infine bisogna indicare seam_examples
come nome del dominio e lasciare la sua posizione predefinita.
Ora che si è installato il server e creato il dominio, bisogna imparare ad avviarlo ed arrestarlo, oltre ad accedere alla console di configurazione.
Avviare il dominio:
Questa è la parte facile - entrate nella directory $BEA_HOME/user_projects/domains/seam_examples/bin
e lanciate lo script ./startWeblogic.sh
Accedere alla console di configurazione:
Col browser andate all'indirizzo http://127.0.0.1:7001/console
. Vi saranno richiesti l'utente e la password inseriti in precedenza. Non ci addentreremo molto in questa questione, ma questo è il punto di partenza per molte delle diverse configurazioni di cui avremo bisogno più tardi.
Arrestare il dominio:
In questo caso ci sono un paio di opzioni:
Il modo raccomandato si basa sulla console di configurazione:
Selezionate seam_examples
sul lato sinistro della console.
Clicacte sulla linguetta Control
nel mezzo della pagina.
Nella tabella selezionate la casella di spunta AdminServer
.
Scegliete Shutdown
appena sopra la tabella, e selezionate l'opzione appropriata tra When work completes
e Force shutdown now
.
Premere Ctrl-C
nel terminale in cui è stato avviato il dominio.
Non si sono visti effetti negativi, but non raccomanderemmo di effettuare questa operazione mentre si stanno apportando delle modifiche alla configurazione nella console.
Quando si utilizza la directory /autodeploy
come descritto in questo capitolo, è possibile vedere delle eccezioni NoClassDefFound
durante il re-deploy delle applicazioni. Se le vedete, provate a riavviare il server. Se continuate a vederle, eliminate i file EAR/WAR autoinstallati, riavviate il server e rifate il deploy. Non abbiamo trovato la ragione specifica di questo comportamento, tuttavia sembra che anche altri abbiano avuto questo genere di problema.
Queste sono le istruzioni per installare e configurare le librerie JSF 1.2 di Weblogic. Weblogic non viene distribuito con le librerie JSF preinstallate. Per i dettagli completi si veda Weblogic 10.3 Configuring JSF and JSTL Libraries
Nella console di amministrazione navigate alla pagina Deployments
usando il menù sul lato sinistro.
A questo punto prenmete il pulsante Install
in cima alla tabella dei deployment
Usando il browser delle directory navigate alla directory $BEA_HOME/wlserver_10.3/common/deployable-libraries
. Selezionate l'archivio jsf-1.2.war
, e cliccate il pulsante Next
.
Accertatevi che sia selezionata l'opzione Install this deployment as a library
. Cliccate il pulsante Next
della pagina Install Application Assistant
.
Premete il pulsante Next
della pagina Optional Settings
.
Accertatevi che sia selezionata l'opzione Yes, take me to the deployment's configuration screen.
. Cliccate il pulsante Finish
della pagina Review your choices and click Finish
.
Nella pagina Impostazioni per jsf(1.2,1.2.3.1)
impostate Deployment Order
a 99
in modo che il supporto JSF venga installato prima delle applicazioni sottoposte ad autodeploy. Poi cliccate sul bottone Save
.
Bisogna eseguire un altro passo per far funzionare il tutto. Per qualche motivo, anche eseguendo le operazioni precedenti, durante il deploy dell'applicazione non vengono trovate delle classi di jsf-api.jar
. L'unico modo per ovviare al problema è di spostare javax.jsf_1.2.0.0.jar
(il jsf-api.jar) da jsf-1.2.war
nelle librerie condivise dei domini. Questo richiede il riavvio del server.
Si vuole usare Seam con gli EJB su Weblogic? In questo caso ci sono alcuni ostacoli da evitare o alcune patch di BEA ad installare. Questa sezione descrive questi ostacoli e quali modifiche apportare all'esempio jee5/booking
per installarlo correttamente e farlo funzionare.
Per molte versione successive di Weblogic c'è stato un problema relativo a come Weblogic genera gli stub e a come compila gli EJB che usano argomenti variabili nei propri metodi. Problema confermato nelle versioni 9.X e 10.0.MP1. Purtroppo la versione 10.3 lo affronta solo parzialmente come dettagliato di seguito.
La spiegazione base del problema è che il compilatore EJB di Weblogic confonde i metodi che usano varargs
con i metodi col modificatore transient
. Quando BEA genera le proprie classi stub da quelle classi durante il deploy, esso non ha successo. Seam usa argomenti variabili in uno dei suoi EJB interni ( TimerServiceDispatcher
). Se durante il deply si vedono eccezioni come quella riportata sotto, la versione corrente è la 10.0.MP1 senza patch.
java.io.IOException: Compiler failed executable.exec: /jboss/apps/bea/wlserver_10.0/user_projects/domains/seam_examples/servers/AdminServer /cache/EJBCompilerCache/5yo5dk9ti3yo/org/jboss/seam/async/ TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java:194: modifier transient not allowed here public transient javax.ejb.Timer scheduleAsynchronousEvent(java.lang.String arg0, java.lang.Object[] arg1) ^ /jboss/apps/bea/wlserver_10.0/user_projects/domains/seam_examples/servers/AdminServer /cache/EJBCompilerCache/5yo5dk9ti3yo/org/jboss/seam/async/ TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java:275: modifier transient not allowed here public transient javax.ejb.Timer scheduleTimedEvent(java.lang.String arg0, org.jboss.seam.async.TimerSchedule arg1, java.lang.Object[] arg2)
Questo problema è stato risolto con Weblogic 10.3 e BEA ha rilasciato una patch per Weblogic 10.0.MP1 ( CR327275
) che può essere richiesta al loro supporto.
Purtroppo BEA ha verificato e annunciato un secondo problema.
Questo problema è comparso una volta applicata la patch CR327275
alla 10.0.MP1. Questo nuovo errore è stato confermato da BEA che ha creato una patch apposita per la 10.0.MP1. Questa patch viene identificata sia come CR370259
che come CR363182
. Come l'altra, anche questa può essere richiesta al supporto BEA.
Questo difetto fa in modo che certi metodi EJB erroneamente non vengano inseriti nelle classi stub interne di Weblogic. Questo da luogo ai seguenti messaggi di errore durante il deploy.
<<Error > <EJB > <BEA-012036 > <Compiling generated EJB classes produced the following Java compiler error message: <Compilation Error > TimerServiceDispatcher_qzt5w2_Impl.java: The type TimerServiceDispatcher_qzt5w2_Impl must implement the inherited abstract method TimerServiceDispatcher_qzt5w2_Intf.scheduleTimedEvent(String, Schedule, Object[]) <Compilation Error > TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java: Type mismatch: cannot convert from Object to Timer <Compilation Error > TimerServiceDispatcher_qzt5w2_LocalTimerServiceDispatcherImpl.java: Type mismatch: cannot convert from Object to Timer > <Error > <Deployer > <BEA-149265 > <Failure occurred in the execution of deployment request with ID '1223409267344' for task '0'. Error is: 'weblogic.application.ModuleException: Exception preparing module: EJBModule(jboss-seam.jar)
Sembra che, quando Weblogic 10.3 è stato rilasciato, si siano dimenticati di includere questa correzione!! Ciò significa che Weblogic 10.0.MP1 con le patch funzionerà correttamente, ma che la 10.3 richiederà ancora il jar speciale di Seam descritto sotto. Non tutti gli utenti si sono imbattuti in questo problema, e vi possono essere delle combinazioni OS/JRE in cui non si verifica, comunque è stato avvistato molte volte. Si spera che Oracle/BEA rilasceranno una patch aggiornata per questo difetto per la 10.3. Quando lo faranno aggiorneremo queste istruzioni come necessario.
In modo che gli utilizzatori di Seam possano fare il deploy di un'applicazione EJB su Weblogic, a partire da Seam 2.0.2.CR2, è stato creato un jar speciale apposta per Weblogic. Si trova nella directory $SEAM/lib/interop
e si chiama jboss-seam-wls-compatible.jar
. L'unica differenza tra questo jar e jboss-seam.jar
è che il primo non contiene l'EJB TimerServiceDispatcher
. Per usarlo basta cambiarne il nome in jboss-seam.jar
e sostituire il jboss-seam.jar
originale nel file EAR
dell'applicazione. L'esempio jee5/booking
ne fornisce una dimostrazione. Ovviamente con questo jar non sarà possibile usare le funzionalità di TimerServiceDispatcher
.
In questa sezione passeremo in rassegna i passi necessari a preparare e far funzionare l'esempio jee5/booking
.
Questo esempio usa il database hypersonic residente in memoria, e bisogna allestire il datasource in modo corretto. Per configurarlo la console di amministrazione si basa su un insieme di pagine in stile wizard.
Bisogna copiare hsqldb.jar
nella directory delle librerie condivise del dominio Weblogic: cp $SEAM_HOME/lib/hsqldb.jar $BEA_HOME/user_projects/domains/seam_examples/lib
Avviate il server e navigate alla console amministrativa seguendo Sezione 39.1.3, «Come avviare/arrestare/accedere il dominio»
Nell'albero di sinistra navigate a seam_examples - Services- JDBC - Data Sources
.
Poi selezionate il bottone New
in cima alla tabella dei data source
Compilate come segue:
Name: seam-jee5-ds
JNDI Name: seam-jee5-ds
Database Type and Driver (Tipo di database e driver): other
Premete il pulsante Next
Cliccate il pulsante Next
della pagina Transaction Options
Compilate i campi seguenti della pagina Connection Properties
(Proprietà di connessione):
Database Name: hsqldb
Host Name: 127.0.0.1
Port: 9001
Username: sa
saranno campi password vuoti.
Password: lasciare vuoto.
Premete il pulsante Next
Compilate i campi seguenti della pagina Connection Properties
(Proprietà di connessione):
Driver Class Name: org.hsqldb.jdbcDriver
URL: jdbc:hsqldb:.
Username: sa
Password: lasciare vuoto.
Lasciare il resto dei campi come sono.
Premete il pulsante Next
Scegliete il dominio di pertinenza del data source, nel nostro caso l'unico esistente AdminServer
. Premete Next
.
Bene - ora siamo finalmente pronti a cominciare a sistemare l'applicazione Seam per essere installata sul server Weblogic.
resources/META-INF/persistence.xml
Modificate la proprietà jta-data-source
in quello che avete inserito sopra:
<jta-data-source
>seam-jee5-ds</jta-data-source
>
Poi commentate le proprietà di glassfish.
Poi aggiungete queste due proprietà per il supporto di Weblogic.
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.WeblogicTransactionManagerLookup"/>
resources/META-INF/weblogic-application.xml
Questo file deve essere creato e deve contenere ciò che segue:
<?xml version="1.0" encoding="ISO-8859-1"?>
<weblogic-application>
<library-ref>
<library-name
>jsf</library-name>
<specification-version
>1.2</specification-version>
<implementation-version
>1.2</implementation-version>
<exact-match
>false</exact-match>
</library-ref>
<prefer-application-packages>
<package-name
>antlr.*</package-name>
</prefer-application-packages>
</weblogic-application>
Queste modifiche fanno due cose differenti. Il primo elemento library-ref
dice a weblogic che questa applicazione userà le librerie JSF installate. Il secondo elemento prefer-application-packages
dice a weblogic che i jar antlr
hanno la precedenza. Questo evita conflitti con hibernate.
resources/META-INF/ejb-jar.xml
Le modifiche qui descritte aggirano un problema per cui Weblogic usa una sola istanza di sessionBeanInterceptor
per tutti i session bean. L'interceptor di Seam tiene in memoria alcuni attributi specifici del componente, così che quando arriva una chiamata - l'interceptor è predisposto per un diverso componente e compare un errore. Per risolvere questo difetto, per ogni EJB, bisogna definire una apposita associazione con un diverso interceptor (interceptor binding). Così facendo Weblogic userà un'istanza separata per ciascun EJB.
Bisogna modificare l'elemento assembly-descriptor
in modo che appaia così:
<assembly-descriptor>
<interceptor-binding
>
<ejb-name
>AuthenticatorAction</ejb-name>
<interceptor-class
>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
<interceptor-binding
>
<ejb-name
>BookingListAction</ejb-name>
<interceptor-class
>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
<interceptor-binding
>
<ejb-name
>RegisterAction</ejb-name>
<interceptor-class
>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
<interceptor-binding
>
<ejb-name
>ChangePasswordAction</ejb-name>
<interceptor-class
>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
<interceptor-binding
>
<ejb-name
>HotelBookingAction</ejb-name>
<interceptor-class
>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
<interceptor-binding
>
<ejb-name
>HotelSearchingAction</ejb-name>
<interceptor-class
>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
<interceptor-binding
>
<ejb-name
>EjbSynchronizations</ejb-name>
<interceptor-class
>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
</assembly-descriptor
>
resources/WEB-INF/weblogic.xml
Questo file deve essere creato e deve contenere ciò che segue:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app
>
<library-ref>
<library-name
>jsf</library-name>
<specification-version
>1.2</specification-version>
<implementation-version
>1.2</implementation-version>
<exact-match
>false</exact-match>
</library-ref>
</weblogic-web-app>
Questo file e l'elemento library-ref
dicono a Weblogic che questa applicazione userà le librerie JSF installate. Ciò è necessario sia in questo file che che nel file weblogic-application.xml
poiché entrambe le applicazioni devono accedervi.
Bisogna fare alcune modifiche allo script di build e al jar jboss-seam.jar
, poi è possibile fare il deploy dell'applicazione.
build.xml
Per inserire nel pacchetto weblogic-application.xml
dobbiamo aggiungere ciò che segue.
<!-- Resources to go in the ear -->
<fileset id="ear.resources" dir="${resources.dir}">
<include name="META-INF/application.xml" />
<include name="META-INF/weblogic-application.xml" />
<include name="META-INF/*-service.xml" />
<include name="META-INF/*-xmbean.xml" />
<include name="treecache.xml" />
<include name="*.jpdl.xml" />
<exclude name=".gpd.*" />
<include name="*.cfg.xml" />
<include name="*.xsd" />
</fileset
>
$SEAM/lib/interop/jboss-seam-wls-compatible.jar
Questa è la modifica discussa sopra in Sezione 39.2.1, «I problemi di Weblogic con EJB3» . In realtà ci sono due opzioni.
Rinominate questo e jar e sostituitelo al file originale $SEAM/lib/jboss-seam.jar
. Questo approccio non richiede modifiche dell'archivio EAR
, ma sovrascrive il jboss-seam.jar
originale.
L'altra opzione consiste nel modificare l'archivio EAR
e nel sostituire il file jboss-seam.jar
dell'archivio manualmente. Questo lascia il jar originale intatto, ma richiede un passaggio manuale ogni volta che si crea l'archivio.
Supponendo di scegliere la prima opzione per gestire il jboss-seam-wls-compatible.jar
possiamo fare il build dell'applicazione lanciando ant archive
nella directory di base dell'esempio jee5/booking
.
Poichè si è scelto di creare il nostro dominio Weblogic in modalità sviluppo, è possibile fare il deploy dell'applicazione mettendo il file EAR nella directory degli autodeply dei domini.
cp ./dist/jboss-seam-jee5.ear $BEA_HOME/user_projects/domains/seam_examples/autodeploy
Verifichiamo il funzionamento dell'applicazione all'indirizzo http://localhost:7001/seam-jee5/
Questo è l'esempio Hotel Booking implementato con i POJO di Seam con la JPA di Hibernate e non richiede il supporto EJB3 per funzionare. L'esempio ha già un insieme predisposto di configurazioni e script di build per molti dei container più comuni, incluso quelli di Weblogic 10.X
Innanzitutto faremo il build dell'esempio per Weblogic 10.x e completeremo i passi necessari a farne il deploy. Poi parleremo delle differenze tra le diverse versioni di Weblogic, e con la versione per JBoss.
Sinoti che questo esempio assume che le librerie JSF di Weblogic siano state configurate come descritto in Sezione 39.1.4, «Impostazione del supporto JSF in Weblogic».
Nel primo passo si allestisce il datasource, nel secondo si fa il build dell'applicazione e nel terzo si fa il deploy.
Le versioni 10.X dell'esempio useranno il database hsql residente in memoria invece del database preconfigurato PointBase. Se si vuole usare PointBase bisogna predisporre un datasource per PointBase, e sistemare l'impostazione relativa al dialetto di hibernate in persistence.xml
in modo da utilizzare quello di PointBase. Come riferimento, l'esempio jpa/weblogic92
usa PointBase.
La configurazione del datasource è molto simile a quanto descritto per j2ee5 in Sezione 39.2.2.1, «Configurare il datasource hsql» . Seguite i passi di quella sezione, ma usate le seguenti impostazioni dove necessario.
DataSource Name: seam-jpa-ds
JNDI Name: seam-jpa-ds
Il build dell'esempio richiede di lanciare il comando ant corretto:
ant weblogic10
. Questo creerà una distribuzione e una struttura di directory d'archivio specifici per il container.
Quando Weblogic è stato installato seguendo Sezione 39.1.2, «Creazione del dominio Weblogic», abbiamo scelto di far operare il dominio in modalità sviluppo. Ciò significa che per fare il deploy basta copiare l'applicazione nella directory di autodeploy.
cp ./dist-weblogic10/jboss-seam-jpa.war $BEA_HOME/user_projects/domains/seam_examples/autodeploy
Verifichiamo il funzionamento all'indirizzo http://localhost:7001/jboss-seam-jpa/
.
Tra gli esempi per Weblogic 10.x e quelli per Weblogic 9.2 ci sono parecchie differenze:
META-INF/persistence.xml
— La versione 9.2 è configurata per usare il database PointBase
e un datasource preinstallato. La versione 10.x usa il database hsql
e un datasource personalizzato.
WEB-INF/weblogic.xml
— Questo file e il suo contenuto risolvono un difetto di una vecchia versione delle librerie ANTLR
che Weblogic 10.x usa internamente. Anche OC4J ha lo stesso difetto. Inoltre configura l'applicazione per usare le librerie JSF condivise installate e configurate sopra.
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app
xmlns="http://www.bea.com/ns/weblogic/90"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/90
http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
<library-ref>
<library-name
>jsf</library-name>
<specification-version
>1.2</specification-version>
<implementation-version
>1.2</implementation-version>
<exact-match
>false</exact-match>
</library-ref>
<container-descriptor>
<prefer-web-inf-classes
>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app
>
Questo fa sì che Weblogic usi classi e librerie dell'applicazione web prima delle classi e librerie del classpath. Senza questa modifica hibernate è costretto ad usare una query factory più vecchia e più lenta impostando la seguente proprietà del file META-INF/persistence.xml
.
<property name="hibernate.query.factory_class"
value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>
WEB-INF/components.xml
— In Weblogic 10.x le transazioni JPA per gli entity vengono abilitate aggiungendo:
<transaction:entity-transaction entity-manager="#{em}"/>
WEB-INF/web.xml
— Poiché il file jsf-impl.jar
non si trova nel WAR
bisogna configurare questo listener:
<listener>
<listener-class
>com.sun.faces.config.ConfigureListener</listener-class>
</listener
>
Tra la versione per Weblogic 10.x e la versione per JBoss ci sono ulteriori modifiche. Eccole di seguito:
META-INF/persistence.xml
— Tranne che per il nome del datasource la versione Weblogic è come segue:
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.WeblogicTransactionManagerLookup"/>
WEB-INF/lib
— La versione Weblogic richiede parecchie librerie poiché esse non sono già incluse come avviene con JBoss. Si tratta innanzitutto di quelle per hibernate e le sue dipendenze.
Per usare Hibernate come provider JPA servono i jar seguenti:
hibernate.jar
hibernate-annotations.jar
hibernate-entitymanager.jar
hibernate-validator.jar
jboss-common-core.jar
commons-logging.jar
commons-collections.jar
jboss-common-core.jar
Ecco diversi jar di terze parti di cui Weblogic ha bisogno:
antlr.jar
cglib.jar
asm.jar
dom4j.jar
el-ri.jar
javassist.jar
concurrent.jar
seam-gen
è uno strumento molto utile agli sviluppatori per creare e far funzionare velocemente un'applicazione e fornisce le fondamenta cui aggiungere le proprie funzionalità. Di default seam-gen
produrrà applicazioni configurate per essere eseguite su JBoss AS. Queste istruzioni mostreranno i passi necessari a farlo funzionare su Weblogic
seam-gen
è stato realizzato per essere semplice così, come si può immaginare, il deploy di un'applicazione generata da seam-gen
in Weblogic 10.x non è troppo difficile. Sostanzialmente consiste nell'aggiornamento o nell'eliminazione di alcuni file di configurazione e nell'aggiunta dei jar delle dipendenze di cui Weblogic 10.x non è dotata.
Questo esempio illustrerà il deploy seam-gen WAR
di base. Mostrerà i componenti POJO di Seam, la JPA di Hibernate, i Facelets, la sicurezza di Drools, le RichFaces, e un datasource configurabile.
La prima cosa da fare è dare a seam-gen
le informazioni riguardanti il progetto da creare. A questo scopo occorre eseguire ./seam setup
nella directory di base della distribuzione di Seam. Si noti che qui i percorsi sono i nostri e devono essere liberamente adattati al vostro ambiente.
./seam setup Buildfile: build.xml init: setup: [echo] Welcome to seam-gen :-) [input] Enter your Java project workspace (the directory that contains your Seam projects) [C:/Projects] [C:/Projects] /home/jbalunas/workspace [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA] [C:/Program Files/jboss-4.2.3.GA] /jboss/apps/jboss-4.2.3.GA [input] Enter the project name [myproject] [myproject] weblogic-example [echo] Accepted project name as: weblogic_example [input] Select a RichFaces skin (not applicable if using ICEFaces) [blueSky] ([blueSky], classic, ruby, wine, deepMarine, emeraldTown, sakura, DEFAULT) [input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support) [ear] ([ear], war, ) war [input] Enter the Java package name for your session beans [org.jboss.seam. tutorial.weblogic.action] [org.jboss.seam.tutorial.weblogic.action] org.jboss.seam.tutorial.weblogic.action [input] Enter the Java package name for your entity beans [org.jboss.seam. tutorial.weblogic.model] [org.jboss.seam.tutorial.weblogic.model] org.jboss.seam.tutorial.weblogic.model [input] Enter the Java package name for your test cases [org.jboss.seam. tutorial.weblogic.action.test] [org.jboss.seam.tutorial.weblogic.action.test] org.jboss.seam.tutorial.weblogic.test [input] What kind of database are you using? [hsql] ([hsql], mysql, oracle, postgres, mssql, db2, sybase, enterprisedb, h2) [input] Enter the Hibernate dialect for your database [org.hibernate. dialect.HSQLDialect] [org.hibernate.dialect.HSQLDialect] [input] Enter the filesystem path to the JDBC driver jar [/tmp/seamlib/hsqldb.jar] [/tmp/seam/lib/hsqldb.jar] [input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver] [org.hsqldb.jdbcDriver] [input] Enter the JDBC URL for your database [jdbc:hsqldb:.] [jdbc:hsqldb:.] [input] Enter database username [sa] [sa] [input] Enter database password [] [] [input] Enter the database schema name (it is OK to leave this blank) [] [] [input] Enter the database catalog name (it is OK to leave this blank) [] [] [input] Are you working with tables that already exist in the database? [n] (y, [n], ) [input] Do you want to drop and recreate the database tables and data in import.sql each time you deploy? [n] (y, [n], ) [input] Enter your ICEfaces home directory (leave blank to omit ICEfaces) [] [] [propertyfile] Creating new property file: /rhdev/projects/jboss-seam/cvs-head/jboss-seam/seam-gen/build.properties [echo] Installing JDBC driver jar to JBoss server [copy] Copying 1 file to /jboss/apps/jboss-4.2.3.GA/server/default/lib [echo] Type 'seam create-project' to create the new project BUILD SUCCESSFUL
Digitate ./seam new-project
per creare il progetto e cd /home/jbalunas/workspace/weblogic_example
per vedere il progetto appena creato.
Innanzitutto bisogna modificare ed eliminare dei file di configurazione, poi bisogna aggiornare le librerie che sono installate insieme all'applicazione.
build.xml
Modificate il target di default in archive
.
<project name="weblogic_example" default="archive" basedir="."
>
resources/META-INF/persistence-dev.xml
Cambiate jta-data-source
in seam-gen-ds
(e usatelo come jndi-name
all'atto della creazione del datasource nella console amministrativa di Weblogic)
Modificate il tipo di transazione in RESOURCE_LOCAL
in modo da poter usare le transazioni JPA.
<persistence-unit name="weblogic_example" transaction-type="RESOURCE_LOCAL"
>
Per il supporto di Weblogic bisogna aggiungere/modificare le seguenti proprietà:
<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.HashtableCacheProvider"/>
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.WeblogicTransactionManagerLookup"/>
Bisognerà anche aggiornare persistence-prod.xml
se si vuole fare il deploy in Weblogic usando il profilo prod (profilo di produzione).
resource/WEB-INF/weblogic.xml
Bisogna creare questo file e popolarlo come in description of WEB-INF/weblogic.xml.
resource/WEB-INF/components.xml
Vogliamo usare le transazioni JPA, quindi dobbiamo aggiungere quanto segue in modo che Seam ne sia informato.
<transaction:entity-transaction entity-manager="#{entityManager}"/>
Bisogna aggiungere anche il namespace delle transazioni e la posizione dello schema in cima al documento.
xmlns:transaction="http://jboss.com/products/seam/transaction"
http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.1.xsd
resource/WEB-INF/web.xml
WEB-INF/web.xml
— Poiché il file jsf-impl.jar
non si trova nel WAR
bisogna configurare questo listener:
<listener>
<listener-class
>com.sun.faces.config.ConfigureListener</listener-class>
</listener
>
resources/WEB-INF/jboss-web.xml
E' possibile eliminare questo file dal momento che non si sta per fare il deploy su JBoss AS ( jboss-app.xml
è usato per abilitare l'isolamento del classloading in JBoss AS)
resources/*-ds.xml
E' possibile eliminare questi file poiché non si sta per fare il deploy in JBoss AS. Questi file definiscono i datasource di JBoss, mentre per Weblogic useremo la console amministrativa.
L'applicazione seam-gen
ha dipendendenze delle librerie molto simili a quelle dell'esempio jpa
visto sopra. Si veda Sezione 39.3.2, «Differenze con Weblogic 10.x». Sotto sono riportati i cambiamenti necessari a realizzare tali dipendenze in questa applicazione.
build.xml — Ora dobbiamo sistemare il file build.xml
. Trovate il target war
e aggiungete quanto segue in fondo al target.
<copy todir="${war.dir}/WEB-INF/lib">
<fileset dir="${lib.dir}">
<!-- Misc 3rd party -->
<include name="commons-logging.jar" />
<include name="dom4j.jar" />
<include name="javassist.jar" />
<include name="cglib.jar" />
<include name="antlr.jar" />
<!-- Hibernate -->
<include name="hibernate.jar" />
<include name="hibernate-commons-annotations.jar" />
<include name="hibernate-annotations.jar" />
<include name="hibernate-entitymanager.jar" />
<include name="hibernate-validator.jar" />
<include name="jboss-common-core.jar" />
<include name="concurrent.jar" />
</fileset>
</copy
>
Rimane solo il deploy dell'applicazione. Questo equivale a preparare il datasource e fare il build e il deploy dell'applicazione.
La configurazione del datasource è molto simile a quella jee5 di Sezione 39.2.2.1, «Configurare il datasource hsql». Tranne per quanto qui indicato seguite le istruzioni del link.
DataSource Name: seam-gen-ds
JNDI Name: seam-gen-ds
Questo è facile quanto digitare ant
nella directory di base dei progetti.
Quando Weblogic è stato installato seguendo Sezione 39.1.2, «Creazione del dominio Weblogic», abbiamo scelto di far operare il dominio in modalità sviluppo. Ciò significa che per fare il deploy basta copiare l'applicazione nella directory di autodeploy.
cp ./dist/weblogic_example.war /jboss/apps/bea/user_projects/domains/seam_examples/autodeploy
Verificate il funzionamento dell'applicazione all'indirizzo http://localhost:7001/weblogic_example/
.