Java 使用客户端ejbjar查找远程ejb

Java 使用客户端ejbjar查找远程ejb,java,ejb,weblogic,lookup,Java,Ejb,Weblogic,Lookup,我将应用程序打包为一个.ear文件,其中包含ejb模块。存在实现远程接口的无状态会话bean。大概是这样的: package my.package.ext.impl; [...] @Stateless(name = "MyPropertiesHandler", mappedName = "ejb/MyPropertiesHandler") public class PropertiesHandler implements PropertiesHandlerRemote { [...]

我将应用程序打包为一个.ear文件,其中包含ejb模块。存在实现远程接口的无状态会话bean。大概是这样的:

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上运行它,正如您在上面看到的那样。

有什么不对劲的想法吗?

因为您有一个
NoClassDefFoundError
,这并不意味着找不到您的
PropertiesHandlerRemote
类,但是您的实现所使用的东西-因此,您可能还有其他不在客户端类路径中的依赖项?

问题是,客户端ejb jar打包在ear文件的根目录中,而不是与其他依赖项一起打包在/lib文件夹中。
解决方案是在要使用客户机ejb jar文件的项目pom中使用
client
标记,而不是
ejb client

这里也讨论了这个问题:

奇怪的是,这是我第一次遇到这样的问题,以前的
ejbclient
tag工作得很好

所以我相信它可以编译,您在maven中为这个依赖项设置了什么范围?WL在运行时未找到该类。@Kris感谢您的回复。没有指定范围,所以我猜它是默认编译的。不管怎样,它是打包成一个.ear和包含在其中的客户端ejb jar的。谢谢回复。我在同一个容器上部署了原始ear文件,所以所有必需的内容都应该在类路径上。无论如何,我刚刚尝试从ejb客户端生成配置中删除所有“排除”注释,所以所有内容都包含在这个jar中。它没有帮助:(如果你从容器中使用ejb,为什么你必须通过JNDI获取引用,而不让它通过
@ejb
?或者你说的是第二个容器试图远程访问第一个容器中的ejb?第二个是正确的;)我只是不准确。此外,这个bean是从简单java类中查找的,它不在托管上下文(不是ejb)中,因此
@ejb
注入将不起作用?然后它仍然是一个“简单的java类”,但您可以使用注入来获取引用。但是,对于根本问题-
NoClassDefFoundError
简单地说,类装入器在处理类的定义时找不到类。所以我会再次检查,如果你的客户真的“看到”了所有必要的类。