Monday, March 12, 2007

Tomcat "castrato"

...ovvero come perdere una giornata di lavoro credendo che fosse colpa di LifeRay e invece era colpa di Tomcat. (ma anche LifeRay ci ha messo del suo)

Partiamo dalla soluzione, che è un po' più utile. Se usando Tomcat (5.5.20...ma anche 5.5.17, non ho provato gli altri) vi succede di non riuscire a usare le mail session configurate come risorse JNDI dato che facendone il lookup ricevete in risposta una bella ClassNotFoundException: org.apache.naming.factory.MailSessionFactory, la colpa non è vostra, ma di quei burloni che sviluppano Tomcat che si sono dimenticati di distribuirla. Tale classe dovrebbe trovarsi in common/lib/naming-factory.jar, ma viene inclusa solo se durante il build di Tomcat si è avuta l'accortezza di mettere nel classpath le JavaMail e il JavaBeans Activation Framework. Non so se questo sia voluto, visto che ormai si ripete da almeno 2 versioni, certo è che è una bella scocciatura.

Ho quindi dovuto ricompilare Tomcat dai sorgenti (5.5.20) per produrre un JAR contenente le factory mancanti. Dato che non è proprio semplicissimo, se volete evitarvi la fatica potete scaricarlo da qui:

http://snipurl.com/nfjar

Sostituitelo a quello presente in common/lib.

Il punto di partenza del problema è stato ancora più subdolo...da qui la giornata persa. Infatti stavo cercandi di far funzionare le mail session con LifeRay, usando ovviamente Tomcat come Servlet/JSP container. Il problema segnalato da LifeRay non era la tutto sommato chiara ClassNotFoundException, bensì una incomprensibile javax.naming.NameNotFoundException: Name mail is not bound in this Context. Ovviamente, controllando la console di amministrazione, il nome JNDI era definito! Il problema è che LifeRay cerca di "indovinare" il nome JNDI (che ovviamente cambia da server a server), ma facendo questo si perde (ignorandole e nascondendocele completamente) le vere cause dei problemi...quindi un'intera giornata persa cercando di configurare le risorse JNDI, quando invece bisognava "aggiustare" un JAR.

Per fortuna comunque che LifeRay è opensource e ho potuto esaminarne i sorgenti per capire la vera causa di questo errore, altrimenti sarebbe stato impossibile.

7 comments:

gtrev said...

Buono a sapersi! Certo senza i sorgenti sarebbe stata dura! A me è capitata recentemente una rogna simile ma con un prodotto proprietario e con del codice prodotto da un generatore.

L'unica via è stata decompilare le classi e ricompilarle inserendo della messaggistica...è proprio vero che si perde più tempo a debuggare che a scrivere codice :(

Lucio Benfante said...

Sì...e per fortuna che il debugger si può anche attaccare da remoto. :)

La cosa strana è che il bundle di LifeRay con Tomcat contiene il naming-factory.jar completo. Quindi il problema sorge installando la distribuzione WAR di LifeRay su un Tomcat "pulito". Ma che stanno combinando quelli di Tomcat? O ultimamente mi sono perso qualcosa io su come bisogna installarlo?

Paolo Donà said...

ero quasi tentato di flaggare il tuo bloc come "contenuto inaccettabile" quando ho visto che usi LifeRay :-)

Lucio Benfante said...

Ciao Paolo.

Contenuto inaccettabile?!?!?

...ma scusa...sopporti le bueae di gtrev...e ti lamenti per il mio post innocente? :)

...scherzi a parte...a voi non è mai capitata questa cosa?

Anonymous said...

Hallo,

I need Help. I am new to Liferay. I want to configure my Liferay that it knows where my EMail server is.

My EmailServer is in a different machine..
Where can I change the configuration.

Please send message to mail ayuruz@yahoo.com

Lucio Benfante said...

Hello,
you need to configure it in your context definition, as a JNDI Resource.

If you are using tomcat, look at conf/Catalina/localhost/ROOT.xml (or replace ROOT with the name of your context).

You should find something like this:

<Resource
name="mail/MailSession"
auth="Container"
type="javax.mail.Session"
mail.smtp.host="my.smtp.server.address"
/>

Of course, replace "my.smtp.server.address", with your SMTP server address. :)

Other SMTP options you can use in that configuration are:

mail.smtp.user="your_smtp_user"
mail.smtp.auth="true/false"
mail.smtp.password="your_smtp_password"
mail.transport.protocol="smtp"

(for example, if you need to authenticate to your SMTP server)

Luca said...

Domanda generale: è possibile usare Liferay per adattare un sito internet ad un dispositivo mobile (WAP,PDA,etc)oppure è troppo complicata come operazione!?
Saluti
Luca