[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ClassLoader problem in Servlet environment (Tomcat)



On Fri, 09 Mar 2001, Nathan Eric Probst wrote:
> If I use a LocalDatabase...
>    LocalDatabase db = new LocalDatabase();
>    db.open("/tmp/ozoneDB", 3);
>    db.reloadClasses();
> 
>    News news = (News) db.createObject( NewsImpl.class.getName());
> 
> I get this exception in the servlet (trimmed)...
> org.ozoneDB.ClassNotFoundExc: com.javawebguy.smg.db.ozone.NewsImpl
>         at
> org.ozoneDB.ExternalDatabase.sendCommand(ExternalDatabase.java:508)
>         at
> org.ozoneDB.ExternalDatabase.sendCommand(ExternalDatabase.java:476)
>         at
> org.ozoneDB.ExternalDatabase.createObject(ExternalDatabase.java:708)
>         at
> org.ozoneDB.ExternalDatabase.createObject(ExternalDatabase.java:697)
>         at
> com.javawebguy.smg.actions.OzoneNewsAction.perform(OzoneNewsAction.java:98)
> 
>         at
> org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1620)
> 
>         at
> org.apache.struts.action.ActionServlet.process(ActionServlet.java:1430)
>         at
> org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:464)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
>         at
> org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
>         at org.apache.tomcat.core.Handler.service(Handler.java:286)
> 
> 
> If I use a RemoteDatabase...
>    ExternalDatabase db = RemoteDatabase.openDatabase(
> "ozonedb:remote://localhost:3333" );
>    db.reloadClasses();
> 
>    News news = (News) db.createObject( NewsImpl.class.getName());
> 
> I get this exception in ozone (trimmed)...
> org.ozoneDB.ClassNotFoundExc: com.javawebguy.smg.db.ozone.NewsImpl
>         at
> org.ozoneDB.core.ClassManager.classForName(ClassManager.java:69)
>         at
> org.ozoneDB.core.Transaction.createObject(Transaction.java:384)
>         at
> org.ozoneDB.core.DbRemote.DbCreateObj.perform(DbCreateObj.java:48)
>         at
> org.ozoneDB.core.Transaction.performCommand(Transaction.java:273)
>         at
> org.ozoneDB.core.TransactionManager.performCommand(TransactionManager.java:366)
> 
>         at
> org.ozoneDB.core.TransactionManager.completeTransaction(TransactionManager.java:334)
> 
>         at
> org.ozoneDB.core.TransactionManager.handleCommand(TransactionManager.java:249)
> 
>         at
> org.ozoneDB.core.InvokeServer.handleClientEvent(InvokeServer.java:76)
>         at
> org.ozoneDB.DxLib.net.DxMultiServerClient.run(DxMultiServerClient.java:44)
> 
>         at java.lang.Thread.run(Thread.java:484)
> 
> I can make it work with RemoteDatabase by putting my WEB-INF/classes
> directory in the classpath when I start ozone, but this is not a good
> solution.

There are two ClassLoaders in ozone, one for jdk1.1 and one for jdk1.2+. By
default the 1.1 is used. This one calls Class.forName() to actually get the
class. I'm not sure if Class.forName() uses the threads ClassLoader which is
needed to get the servlet ClassLoader which probably has access to the WEB-INF
classes. I will check this. Stay tuned.


Falko

> 
> In fact, I need to be able to use only a LocalDatabase and no special
> classpath treatments.  The app I'm developing will be deployed to a
> third-party hosting provider where I will not have control over the
> environment.  So, everything need to work from within the servlet
> context.
> 
> Please help!
> 
> Thanks,
> Nathan Probst
-- 
______________________________________________________________________
Falko Braeutigam                              mailto:falko@smb-tec.com
SMB GmbH                                        http://www.smb-tec.com