简体   繁体   English

Weblogic类加载

[英]Weblogic class loading

We are having a major issue with class loading. 我们在类加载方面遇到了主要问题。

We are trying to do a simple JNDI lookup and we see the following exception: 我们正在尝试做一个简单的JNDI查找,并且看到以下异常:

Caused By: java.lang.ClassNotFoundException: weblogic.rmi.internal.StubInfoIntf
        at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:1029)
        at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:990)
        at weblogic.utils.classloaders.GenericClassLoader.doFindClass(GenericClassLoader.java:611)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:543)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:496)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:473)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at weblogic.utils.classloaders.GenericClassLoader.defineClassInternal(GenericClassLoader.java:1113)
        at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:1046)
        at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:1038)
        at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:990)
        at weblogic.utils.classloaders.GenericClassLoader.doFindClass(GenericClassLoader.java:611)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:543)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:496)
        at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:473)
        at weblogic.rmi.internal.StubGenerator.getStubClass(StubGenerator.java:821)
        at weblogic.rmi.internal.StubGenerator.generateStub(StubGenerator.java:848)
        at weblogic.rmi.internal.StubGenerator.generateStub(StubGenerator.java:843)
        at weblogic.rmi.extensions.StubFactory.getStub(StubFactory.java:73)
        at weblogic.rmi.internal.StubInfo.resolveObject(StubInfo.java:410)
        at weblogic.rmi.internal.StubInfo.readResolve(StubInfo.java:332)
        at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1148)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2036)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
        at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.readObject(RemoteBusinessIntfProxy.java:231)
        at sun.reflect.GeneratedMethodAccessor2058.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2136)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2245)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2125)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
        at weblogic.rmi.extensions.server.CBVInputStream.readObject(CBVInputStream.java:64)
        at weblogic.jndi.internal.JNDIHelper.copyObject(JNDIHelper.java:42)
        at weblogic.jndi.WLSJNDIEnvironmentImpl.copyObjectViaSerialization(WLSJNDIEnvironmentImpl.java:57)
        at weblogic.jndi.internal.JNDIEnvironment$ProxyCopier.copyObject(JNDIEnvironment.java:209)
        at weblogic.jndi.internal.JNDIEnvironment.copyObject(JNDIEnvironment.java:51)
        at weblogic.jndi.internal.WLEventContextImpl.copyObject(WLEventContextImpl.java:433)
        at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:308)
        at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:435)
        at javax.naming.InitialContext.lookup(InitialContext.java:417)

Now, this class: weblogic.rmi.internal.StubInfoIntf is in the same jar where weblogic.rmi.internal.StubGenerator resides. 现在,这个类: weblogic.rmi.internal.StubInfoIntf是在同一个jar放在weblogic.rmi.internal.StubGenerator所在。 (one is obviously found, the other is not) (一个明显被发现,另一个没有被发现)

I've added the following jar to %DOMAIN%/lib: wlthint3client.jar 我已将以下jar添加到%DOMAIN%/ lib:wlthint3client.jar

This contains the missing class but it does not help. 这包含缺少的类,但无济于事。

NOTE1: 注意1:

Its important to point out, that 重要的是要指出,

weblogic.rmi.internal.StubGenerator.getStubClass(StubGenerator.java:821)

Does indeed initiates the lookup with a different class loader, which might explain why the class is not found, but where also do I need to put the jar, or how should I configure weblogic class loading for it to work? 是否确实使用其他类加载器启动了查找,这也许可以解释为什么找不到该类,但是还需要把jar放在哪里,或者应该如何配置weblogic类加载才能使其工作?

NOTE2 笔记2

I've looked up all of the jars on the server that contain weblogic.rmi.internal.StubGenerator . 我已经查找了包含weblogic.rmi.internal.StubGenerator的服务器上的所有jar。 I guessed maybe there is a weird version of a jar that is loaded prior to wlthint3client.jar and is in middleware or somewhere and causes the issue. 我猜想可能是在wlthint3client.jar之前加载了一个奇怪的jar版本,并且它在中间件中或某个地方,从而导致了问题。 I found 4 jars, all of which contained both classes. 我找到了4个罐子,所有的罐子都包含两个类。

NOTE3 注意3

Along this line... A particular part of the stacktrace lead me to this code snippet: 沿着这条线... stacktrace的特定部分将我引到以下代码片段:

 private static Class getStubClass(StubInfo info, ClassLoader cl) {
        Class c;
        try {
            c = cl.loadClass(info.getStubName());
        } catch (ClassNotFoundException var4) {
            c = hotCodeGenClass(info, cl);
        }

        return c;
    }

Should this not indicate that ClassNotFoundException should be caught? 这是否不应该表明应该捕获ClassNotFoundException? The reason I'm asking is because I saw several bugs searching for the cause on the internet and I saw hotCodeGenClass being called in many of them. 我问的原因是因为我在互联网上看到几个错误在搜索原因,并且看到其中许多调用了hotCodeGenClass。 But never in our own stacktrace. 但是永远不要在我们自己的堆栈跟踪中。 That makes me think we are using some different jar somehow. 这让我觉得我们以某种方式使用了一些不同的罐子。

Weblogic version: 12.2.1.3 Weblogic版本:12.2.1.3

  1. The thrown exception is NoClassDefFoundError and not ClassNotFoundException that's why is not caught in that code block 抛出的异常是NoClassDefFoundError,而不是ClassNotFoundException ,这就是为什么未捕获在该代码块中的原因
  2. How could a JNDI lookup in Weblogic throw a NoClassDefFoundError, something is not good in your Weblogic server Weblogic中的JNDI查找如何引发NoClassDefFoundError,您的Weblogic服务器中有些问题
  3. I suggest you not trying to fix the class loading problems in Weblogic but to install a clean new version and try it again 我建议您不要尝试解决Weblogic中的类加载问题,而要安装一个全新的版本并重试

I was eventually able to find the issue: 我最终能够找到问题:

Basically the same as: 基本上与:

https://issues.liferay.com/browse/LPS-67662?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel https://issues.liferay.com/browse/LPS-67662?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

Just replace jndi with rmi accordingly. 只需用rmi相应地替换jndi。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM