【问题标题】:Look-up of remote ejb using client-ejb jar使用 client-ejb jar 查找远程 ejb
【发布时间】:2012-02-08 12:01:50
【问题描述】:

我将应用程序打包为一个 .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 {
    [...]
}

里面还生成了client-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 上运行它。
有什么想法出错了吗?

【问题讨论】:

  • 所以我相信它可以编译,你在 maven 中为这个依赖设置了什么范围? WL 在运行时找不到该类。
  • @Kris 感谢您的回复。没有指定范围,所以我猜它是默认编译的。无论如何,它被打包为一个 .ear 和包含在其中的 client-ejb jar。

标签: java ejb weblogic lookup


【解决方案1】:

问题在于 client-ejb jar 被打包在 ear 文件的根目录中,而不是在具有其他依赖项的 /lib 文件夹中。
解决方案是在要使用客户端-ejb jar 文件的项目的 pom 中使用 <classifier>client</classifier> 标签而不是 <type>ejb-client</type>
这个问题也在这里讨论:http://jira.codehaus.org/browse/MEAR-85
奇怪这是我第一次遇到这样的问题,以前<type>ejb-client</type> 标签工作得很好。

【讨论】:

    【解决方案2】:

    由于您有一个 NoClassDefFoundError,这并不意味着您的 PropertiesHandlerRemote 类没有找到,而是您的实现使用了一些东西 - 所以也许您有更多的依赖项不在客户端的类路径中?

    【讨论】:

    • 感谢您的回复。我在同一个容器上部署了原始耳朵文件,所以所有必需的东西都应该在类路径上。无论如何,我刚刚尝试从 ejb-client 生成配置中删除所有“排除”注释,所以所有内容都包含在这个 jar 中。它没有帮助:(
    • 如果你在容器中使用你的ejb,为什么你必须通过JNDI获取引用,而不是让它通过@EJB注入?还是说第二个容器试图远程访问第一个容器中的 ejb?
    • 第二个是正确的;)我只是不准确。此外,这个 bean 是从简单的 java 类中查找的,它不在托管上下文(不是 ejb)中,所以@ejb 注入将不起作用。
    • 是否可以选择将您的客户端放入应用程序客户端容器中?那么它仍然是一个“简单的 java 类”,但你可以使用注入来获取引用。
    • 但又是根本问题 - NoClassDefFoundErrorsimply 意味着,在处理类的定义时,类加载器找不到类。所以我会仔细检查,如果你的客户真的“看到”了所有必要的课程。
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多