Google Groupes n'accepte plus les nouveaux posts ni abonnements Usenet. Les contenus de l'historique resteront visibles.

ClassNotFoundException when use class(es) loaded by user defined class loader

2 vues
Accéder directement au premier message non lu

Andrejs Eks'a

non lue,
13 mars 2003, 10:45:4413/03/2003
à
Hi,

I have Windows 2000 and Weblogic 6.1 SP4 and following problem,
Exception happen
java.lang.ClassNotFoundException: com.exigen.qa.dvtest.TestData
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:180)
at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:65)
at java.lang.ClassLoader.loadClass(ClassLoader.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:44)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:310)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at weblogic.j2ee.ApplicationManager.loadClass(ApplicationManager.java:126)
at weblogic.j2ee.ApplicationManager.loadClass(ApplicationManager.java:106)
at weblogic.common.internal.WLObjectInputStream.resolveClass(WLObjectInputStream.java:49)
at java.io.ObjectInputStream.inputClassDescriptor(ObjectInputStream.java:913)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:361)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:231)
at java.io.ObjectInputStream.inputObject(ObjectInputStream.java:1181)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:381)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:231)
at weblogic.servlet.internal.AttributeWrapper.getObject(AttributeWrapper.java:107)
at weblogic.servlet.internal.AttributeWrapper.getObject(AttributeWrapper.java:65)
at weblogic.servlet.internal.session.SessionData.getAttribute(SessionData.java:392)
at com.exigen.cs.ChannelServlet.service(ChannelServlet.java:236)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:262)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:198)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2637)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2359)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)


com.exigen.qa.dvtest.TestData is class which is created by dynamically
created class loader which is created with specified URL(s) and web
application class loader as parent.

private URLClassLoader createURLClassLoader(List files) throws
SSFException
{
URLClassLoader classLoader = null;
try
{
URL[] urls = new URL[files.size()];
for(int i = 0; i < files.size(); i++)
{
File file = (File)files.get(i);
urls[i] = new URL("file", null, file.getCanonicalPath() +
(file.isDirectory() ? "/" : ""));
}

classLoader = new URLClassLoader(urls,
getClass().getClassLoader());
}
catch(MalformedURLException me)
{
LogHelper.log(MetamodelConstants.METAMODEL,
LogService.SEVERITY_ERROR, "Invalid URL specification");
throw new SSFException(me, "Invalid URL specification");
}
catch(IOException ioe)
{
LogHelper.log(MetamodelConstants.METAMODEL,
LogService.SEVERITY_ERROR, "Invalid file");
throw new SSFException(ioe, "Invalid file");
}
return classLoader;
}

com.exigen.qa.dvtest.TestData was stored in http Session
httpRequest.getSession().setAttribute(name, scData.getItemToSet(name))
but exception occurs next time when I try restore class from http
Session httpRequest.getSession().getAttribute(name).

Similar problem occurs when it pass com.exigen.qa.dvtest.TestData
trough RMI to remote web application. Remote application can not
create instance of com.exigen.qa.dvtest.TestData, exception occurs:
java.rmi.UnmarshalException: failed to unmarshal class
com.exigen.comm.Response; nested exception is:
java.lang.ClassNotFoundException:
com.exigen.qa.dvtest.TestData
java.lang.ClassNotFoundException: com.exigen.qa.dvtest.TestData
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:180)
at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:65)
at java.lang.ClassLoader.loadClass(ClassLoader.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:44)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:310)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at weblogic.j2ee.ApplicationManager.loadFromNetwork(ApplicationManager.java:274)
at weblogic.j2ee.ApplicationManager.loadClass(ApplicationManager.java:200)
at weblogic.rjvm.MsgAbbrevInputStream.readClassDescriptor(MsgAbbrevInputStream.java:232)
at weblogic.common.internal.ChunkedObjectInputStream$NestedObjectInputStream.readClassDescriptor(ChunkedObjectInputStream.java:334)
at java.io.ObjectInputStream.inputClassDescriptor(ObjectInputStream.java:901)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:361)

Any ideas?


Thanks a lot in Advance
Andrejs

Slava Imeshev

non lue,
13 mars 2003, 16:35:0313/03/2003
à
Hi Andrejs,

Could you show us what com.exigen.cs.ChannelServlet.service
does at and around line number 236?

Also I'd add a check to urls[i] to make sure that it have valid URLs.

Regards,

Slava Imeshev

"Andrejs Eks'a" <lauva...@navigator.lv> wrote in message
news:4843c240.03031...@posting.google.com...

Andrejs Eks'a

non lue,
14 mars 2003, 04:51:1914/03/2003
à
"Slava Imeshev" <ime...@yahoo.com> wrote in message >

> Hi Andrejs,
>
> Could you show us what com.exigen.cs.ChannelServlet.service
> does at and around line number 236?
>
> Also I'd add a check to urls[i] to make sure that it have valid URLs.
>
> Regards,
>
> Slava Imeshev

Hi Slava,

Around line 236 I try restore data stored in HTTP session:
// setting HTTP session data as session-critical data
HttpSession httpSession = httpRequest.getSession();
HashMap existingSessionCriticalInputData = new HashMap();
Enumeration enum = httpSession.getAttributeNames();
while(enum.hasMoreElements())
{
String name = (String)enum.nextElement();
Object value = httpSession.getAttribute(name);
existingSessionCriticalInputData.put(name, value);
request.getSessionCriticalData().setItem(name, value);
}
// done with session-critical data

Data was saved in previous servlet call:
// saving session-critical data to HTTP session
iter = scData.getAllItemsToSet();
while(iter.hasNext())
{
String name = (String)iter.next();
httpSession.setAttribute(name, scData.getItemToSet(name));
}
// done with session-critical data


I don't known what kind of information is saved about class:
com.exigen.qa.dvtest.TestData in HTTP Session.
com.exigen.qa.dvtest.TestData is not located in weblogic class path
but was dynamically loaded from:
D:\Exigen\Weblogic\bea\wlserver6.1\config\TestDomain\applications\DVDpsSecurity\WEB-INF\portal_apps\dvpdetest_app.jar
If I put com.exigen.qa.dvtest.TestData in class path no problem with
servlet and RMI too, but it is not solution for me.
On tomcat my code works with out problems.

Regards,
Andrejs

Slava Imeshev

non lue,
14 mars 2003, 15:22:0414/03/2003
à
Hi Andrejs,

AFAIU the problem is that when this class is not available for the
classloader running code retrieving object from the session.

You can either put that jar file to the WEB-INF/lib or you can try
to hack the into the thread context class loader:

Thread thread = Thread.currentThread();
ContextClassLoader originalClassLoader = thread.getContextClassLoader();

try {

YourURLClassloader yourClassLoader = new
YourURLClassloader(originalClassLoader);
thread.setContextClassLoader(yourClassLoader );

// your code goes here

} finally {
// *Don't forget to restore it*
thread.setContextClassLoader(originalClassLoader);
}


Personally I'd go the first way.

BTW, what is the reason for having your own classloader?
AFAIU the jar containing the class is packaged to web app
anyway?

Hope this helps.

Regards,

Slava Imeshev

"Andrejs Eks'a" <lauva...@navigator.lv> wrote in message
news:4843c240.03031...@posting.google.com...

0 nouveau message