Tomcat nečte knihovny

Bone Flute X

Tomcat nečte knihovny
« kdy: 20. 04. 2011, 15:36:50 »
Zdravím.

Potřeboval bych poradit s nastavením Tomcatu. Mé pokusy vygooglit to dost selhaly.

Mám vytvořený war balíček a v něm přibalený ovladač pro hsqldb. Ten je umístěný (v tom balíčku) v /WEB-INF/lib/hsqldb-1.8.0.5.jar
Nejdřív si to všechno nahraju na ftpko, plus tam přibalím konfigurační xmlko, kterým mu řeknu, že má použít tuto databázi, a kde najde to warko (sekce Context a v něm sekce Resource)
Když to nadeploidnu, tak se to všechno úspěšně rozbalí, zkontroloval jsem i zda tam jsou dotyčné knihovny, práva čtení a tak. Ale aplikace se nespoustí (jedná se o app JIRA), protože catalina prostě tu knihovnu nevidí.
Všechno jsem zkoušel na serveru i u sebe na lokále. Abych věděl jako o co de. Když postavím ten ovladač do cesty, tedy například do tomcat6/lib, tak to najde a všechno funguje.
Nerad bych se mýlil, ale proč to tedy ten tomcat nevidí, v čem jsem udělal chybu? Viz http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html

Díky za odpověď.
« Poslední změna: 20. 04. 2011, 23:47:25 od Petr Krčmář »


alefo

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #1 kdy: 20. 04. 2011, 16:49:54 »
Co je v logoch? ClassNotFoundException?

Java EE guru

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #2 kdy: 20. 04. 2011, 16:58:18 »
JDBC drivery proste do *.war nepatri, Java EE je predepisuje davat do classpath aplikacniho serveru a tam taky funguji. Duvod je v tom, ze kazdy JDBC driver se musi registrovat ve tride java.sql.DriverManager, ktera si na nej drzi referenci ve statickem fieldu. Trida java.sql.DriverManager je natahovana classloaderem aplikacniho serveru, a aby v sobe drzela odkazy na tridy natahovane jinymi classloadery (napr. jednotlivych aplikaci) je cesta do pekel.

Bone Flute X

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #3 kdy: 20. 04. 2011, 17:15:21 »
to:Alefo
Kód: [Vybrat]
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.hsqldb.jdbcDriver'

to: Java EE guru - no, já z tebou defakto souhlasím. Nemám v úmyslu je tam dávat. Ale bazíruju na tom, jakto že mi to ten tomcat nenačte. Co když mi nebude načítat i jiné knihovny - tedy už regulérní? A u tohodle jsem na to narazil.

alefo

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #4 kdy: 20. 04. 2011, 17:26:05 »
Akym sposobom pouzivate HSQLDB? Nie je to nahodou tak, ze ku Connection pristupujete cez JNDI?

Lebo vasa org.apache.tomcat.dbcp... znamena, ze Tomcat ako aplikacia sa snazi nacitat ten JAR, aby ho spristupnil vasej aplikacii a nenachadza ho, a teda zdochne.

V Tomcate nebyvaju problemy s classloadingom beznych kniznic: jedine, co zvykne robit problemy je logovanie.

Nemal by som zbytocne obavy, hodil by som ten hsqldb.jar do tomcatovskeho libu a nechal to tak.

Viacero ludi sa stazuje na divne spravanie HSQLDB, napr. uz len nazov triedy JDBC ovladaca je vysoko nestandardny


Java EE guru

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #5 kdy: 20. 04. 2011, 17:54:39 »
to:Alefo
Kód: [Vybrat]
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.hsqldb.jdbcDriver'

to: Java EE guru - no, já z tebou defakto souhlasím. Nemám v úmyslu je tam dávat. Ale bazíruju na tom, jakto že mi to ten tomcat nenačte. Co když mi nebude načítat i jiné knihovny - tedy už regulérní? A u tohodle jsem na to narazil.

Podle Java EE je standardni postup jak maji aplikace pristupovat do databazi pres DataSource. DataSource vytvari, spravuje a aplikacim zpristupnuje aplikacni server, ktery k tomu potrebuje videt JDBC driver, nebo presneji: trida JDBC driveru musi byt pristupna pres classloader aplikacniho serveru. Tim jsou tridy JDBC driveru specialni a nestaci je balit s aplikaci (i kdyz nektere aplikacni servery to povoluji). Dale - pokud si budete psat jen svou jednu aplikaci, nemusite se bat ze by nejake jeji tridy pro ni nebyly pristupne - vsechny tridy te aplikace budou pristupne pres classloader (vytvoreny aplikacnim serverem), ktery vase aplikace bude pouzivat. Sranda zacne, az budete mit aplikaci vic, a budete chtit aby navzajem nektere classy sdilely, a nektere naopak mely sve privatni. Ale to uz je na absolvovani pokrocileho kurzu Java EE.

Bone Flute X

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #6 kdy: 20. 04. 2011, 17:56:35 »
Ano, ano. Tak nějak. Moc se v tom neorientuju - snažím se na tomcat a javu uplatnit zkušenosti z jiných oborů (c, php, python) což možná může být někdy zavádějící. A ano, jedná se o JNDI.

No, problém není ani tak s HSQL driverem. To samé mi dělá i s mysql driverem. To jsem si zkoušel na lokále. Co říkáte o logování tak to mohu potvrdit.

Proč ho nenajde, a proč zdechne? Nějaká chyba v nastavení? Tomcatu? Nebo to mohu upravit v tom konfiguráku?

Celé je to o tom, že jsem se upjal k myšlence, že tím, že nahraju nějakou knihovnu do app.war/WEB-INF/*.jar tak tím přepíšu knihovnu z tomcat6/jar. Ono v dokumentaci je to snad tak i popsané: http://confluence.atlassian.com/display/JIRA043/Installing+JIRA+on+Tomcat+6.0#InstallingJIRAonTomcat6.0-4.UpdateTomcatLibraries.
Ačkoliv oni navrhují možnost přepsat originální tomcatovské balíčky, to se mi nechce.

A díky tomuto neúspěchu jsem zase nadobyl dojmu, že je něco špatně.

Bone Flute X

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #7 kdy: 20. 04. 2011, 18:00:33 »
Podle Java EE je standardni postup jak maji aplikace pristupovat do databazi pres DataSource. DataSource vytvari, spravuje a aplikacim zpristupnuje aplikacni server, ktery k tomu potrebuje videt JDBC driver, nebo presneji: trida JDBC driveru musi byt pristupna pres classloader aplikacniho serveru. Tim jsou tridy JDBC driveru specialni a nestaci je balit s aplikaci (i kdyz nektere aplikacni servery to povoluji). Dale - pokud si budete psat jen svou jednu aplikaci, nemusite se bat ze by nejake jeji tridy pro ni nebyly pristupne - vsechny tridy te aplikace budou pristupne pres classloader (vytvoreny aplikacnim serverem), ktery vase aplikace bude pouzivat.

Ok, trochu jste mě upokojil, ale znáte to, co si sám neotestuju.

Tohle všechno, co jste popsal jsem tak nějak pochopil - i když dík za shrnutí. Problém je právě v tom, že já se bojím :-)

Sranda zacne, az budete mit aplikaci vic, a budete chtit aby navzajem nektere classy sdilely, a nektere naopak mely sve privatni. Ale to uz je na absolvovani pokrocileho kurzu Java EE.
No, tohle v následujících sto letech nemám v plánu :-)

alefo

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #8 kdy: 20. 04. 2011, 18:06:50 »
V Tomcate je defaultom v classloaderoch webaplikacii child-first classloading, teda najprv sa Tomcat pozera do WEB-INF/lib, resp. WEB-INF/classes a ked sa trieda nenajde, tak sa ide o uroven vyssie. V dokumentacii na Tomcate je o tom zmienka.

Problem je v tom, ze ked idete cez JNDI, tak to nefunguje, lebo JNDI taha AFAIK classy pomocou tomcatovskeho ,,common" classloadera, ktory je v hierarchii nad webaplikacnymi classloadermi a ked sa trieda nenajde v nom, tak sa postupuje hierarchiou uz len nahor... a vas JDBC driver uz nikde vyssie nie je.

Vid http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html ako ste to linkovali.

Podla mna vy ste to prilis prespekulovali, keby ste sa riadili dokumentaciou JIRAy, tak to funguje rovno :-)

Bone Flute X

Re: Tomcat nečte knihovny z app.war/WEB-INF/*.jar
« Odpověď #9 kdy: 20. 04. 2011, 18:16:13 »
Podla mna vy ste to prilis prespekulovali, keby ste sa riadili dokumentaciou JIRAy, tak to funguje rovno :-)
No, to je klidně možné :-) Základem mého překombinování byla myšlenka, že nemohu na hostingu přepisovat sdílené knihovny.

Ale na druhou stranu myslím, že jste mi vysvětlil co jsem potřeboval vědět. Díky moc.