2015-11-18 75 views
0

當執行遠程EJB查找(來自的JBoss 4.3)在J2SE,我遇到以下情況例外:引起:拋出java.lang.ClassNotFoundException:登錄

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 

這裏是格蘭codez,線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); 
     } 
    } 
} 

我很困惑,爲什麼它尋找一個登錄類(爲什麼異常不包限定)?

ShoppingBasketServiceRemote只是一個接口,它導入javax.ejb.Remote註釋並擴展另一個接口 - 既不會引用Log類?另外,你會看到我的例子只將結果轉換爲Object(但如果我換出服務接口,結果是相同的)?

回答

1

ShoppingBasketServiceRemote僅僅是進口 javax.ejb.Remote註釋和擴展另一個接口的接口 - 既不 做出一個Log類的內容?

  • 檢查在接口&他們 傳遞依賴引用的所有對象。有些東西會指向「Log」類。
  • 還要檢查遠程服務器的錯誤,也許錯誤是在 遠程服務器
  • 嘗試做一個簡單的 Class.forName("ShoppingBasketServiceRemote") - 你可能會看到它與同樣的錯誤失敗。

此外,你會看到我的例子只是蒙上結果到對象 (但結果是一樣的,如果我換出服務接口)?

鑄造對象發生後你的JVM能夠加載由ic.lookup(Lookup)返回的對象 - 所以會發生錯誤,您是否投與否。

+0

謝謝,事實證明,擴展接口有一個類的依賴關係,該類使用了一個使用Apache Commons日誌框架的類 - 我知道這個SoC很差。 – Mikaveli

相關問題