2012-02-08 168 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