2012-02-08 370 views
0

我的應用程序打包爲ejb模塊內部的.ear文件。有無狀態會話bean實現遠程接口。事情是這樣的:使用客戶端ejb jar查找遠程ejb

package my.package.ext.impl; 
[...] 
@Stateless(name = "MyPropertiesHandler", mappedName = "ejb/MyPropertiesHandler") 
public class PropertiesHandler implements PropertiesHandlerRemote { 
    [...] 
} 

這:

package my.package.ext; 
[...]  
@Remote 
public interface PropertiesHandlerRemote { 
    [...] 
} 

還有生成的客戶EJB JAR,也有企業的遠程接口和一些其他的東西里面。
此客戶端ejb jar作爲Maven依賴項連接到其他應用程序。
我嘗試查找PropertiesHandler服務從該應用程序:

PropertiesHandlerRemote propertiesHandler = InitialContext.doLookup(
    "ejb/MyPropertiesHandler#my.package.ext.PropertiesHandlerRemote"); 

在這一刻我得到以下錯誤:

java.lang.NoClassDefFoundError: my/package/ext/PropertiesHandlerRemote 
at [...] 
at sun.reflect.GeneratedMethodAccessor633.invoke(Unknown Source) 
Truncated. see log file for complete stacktrace 
Caused By: java.lang.ClassNotFoundException: my.package.ext.PropertiesHandlerRemote 
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:297) 
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179) 
Truncated. see log file for complete stacktrace 

我Weblogic上10.x的運行它,你可以在上面看到。
任何想法出錯了?

+0

所以我相信它編譯,你在maven中爲這個依賴設置了什麼範圍? WL在運行時找不到該類。 – Kris 2012-02-08 12:05:31

+0

@Kris謝謝你的回覆。沒有指定範圍,所以我想它是默認編譯的。無論如何,它被包裝成一個.ear和客戶端ejb的jar包。 – kardanov 2012-02-08 12:11:52

回答

2

問題在於客戶端ejb jar打包在ear文件的根目錄中,而不是打包在其他依賴關係的/ lib文件夾中。
解決方案是使用<classifier>client</classifier>標記而不是<type>ejb-client</type>在您想要使用client-ejb jar文件的項目中使用pom。
這個問題也在這裏討論:http://jira.codehaus.org/browse/MEAR-85
奇怪的是,這是我第一次遇到這樣的問題,以前<type>ejb-client</type>標籤工作完美。

0

既然你有一個NoClassDefFoundError,這並不意味着你PropertiesHandlerRemote未找到類的事,但它是由您的實現 - 那麼也許你有進一步的依賴這不是在客戶端的類路徑?

+0

感謝您的回覆。我在同一個容器上部署了原始的ear文件,因此所有需要的東西都應該放在classpath上。無論如何,我只是試圖從ejb客戶端生成配置中刪除所有「排除」註釋,所以一切都包含在這個罐子裏。它沒有幫助:( – kardanov 2012-02-08 12:43:10

+0

如果你在容器內使用你的ejb,爲什麼你必須通過JNDI獲得引用,並且不要讓它通過'@ EJB'注入呢?或者你是在談論第二個容器試圖遠程訪問第一個中的ejb? – 2012-02-08 13:01:40

+0

秒是正確的;)我只是不準確。此外,這個bean是從簡單的java類中查找的,它不在託管上下文中(不是ejb),所以'@ ejb'注入將不起作用。 – kardanov 2012-02-08 13:08:58