java - 由 : java. lang.ClassNotFoundException 引起:日志

标签 java ejb jndi

在 J2SE 中执行远程 EJB 查找(来自 JBoss 4.3)时,我遇到以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: LLog;
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2499)
    at java.lang.Class.getDeclaredField(Class.java:1951)
    at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1659)
    at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:72)
    at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:480)
    at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:468)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:468)
    at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:365)
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:602)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1706)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1344)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at java.rmi.MarshalledObject.get(MarshalledObject.java:159)
    at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:737)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:654)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at com.example.ShoppingBasketServiceClient.main(ShoppingBasketServiceClient.java:44)
Caused by: java.lang.ClassNotFoundException: Log
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 32 more

这是代码,第 44 行是进行查找的代码:

package com.example;

import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ShoppingBasketServiceClient {

    public static void main(String[] args) throws NamingException {

        Properties props = new Properties();            
        props.setProperty("java.naming.factory.initial",  "org.jnp.interfaces.NamingContextFactory");
        props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
        props.setProperty("java.naming.provider.url", "jnp://localhost:1099");
        String Lookup = "ejb/ShoppingBasketService/remote";

        try {
            InitialContext ic = new InitialContext(props);
            // ShoppingBasketServiceRemote shoppingBasketService = (ShoppingBasketServiceRemote) ic.lookup(Lookup);
            Object shoppingBasketService = (Object) ic.lookup(Lookup);

        } catch (NamingException e) {
            System.out.println("Exception:" + e);
        }
    }
}

我很困惑为什么它要寻找 Log 类(以及为什么异常不是包限定的)?

ShoppingBasketServiceRemote 只是一个导入 javax.ejb.Remote 注释并扩展另一个接口(interface)的接口(interface) - 都不引用 Log 类?此外,您会看到我的示例仅将结果转换为对象(但如果我换成服务接口(interface),结果是相同的)?

最佳答案

ShoppingBasketServiceRemote is just an interface that imports the javax.ejb.Remote annotation and extends another interface - neither make any reference to a Log class?

  • 检查接口(interface)中引用的所有对象及其 传递依赖。有些东西会指向“Log”类。
  • 同时检查远程服务器是否有错误,可能错误出在 远程服务器
  • 尝试做一个简单的 Class.forName("ShoppingBasketServiceRemote") - 您可能会看到它因相同的错误而失败。

Additionally, you'll see my example only casts the result to Object (but the result is the same if I swap out for the service interface)?

在您的 jvm 能够加载 ic.lookup(Lookup) 返回的对象之后,就会发生对象的转换 - 因此无论您是否进行转换,都会发生错误。

关于java - 由 : java. lang.ClassNotFoundException 引起:日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33786573/

相关文章:

java - 使用 'this' 关键字调用 Mockito stub 方法

java - 使用 Tomcat JNDI 创建文件资源

javax.naming.NameNotFoundException : fsmDS not bound

java - JOGL 双缓冲

java - HTML 解析器从正文中提取文本(在 java 中)

java - Selenium 2为特定命令设置超时

java - javax.ejb.Singleton在集群环境下单例如何?

mysql - 在 JBoss 5.1 的 MDB (ActiveMQ) 中捕获 MySQL 死锁

java - JNDI 解决了 ApplicationContext 在 Spring 中没有解决的问题?

java - JodaTime 不会在不匹配的星期几和月份失败