EJB的类加载器问题

时间:2010-08-11 19:04:13

标签: java java-ee ejb classloader geronimo

我正在开发一个包含持久性库(JPA 1.2),EJB 3和Web表示层(JSF)的项目。我使用Eclipse开发应用程序,并且通过eclipse插件在Websphere Application Server Community Edition(Geronimo 2.1.4)上发布应用程序(但是如果我手动发布也会发生同样的事情)。发布到服务器时,我收到以下错误:

java.lang.NoClassDefFoundError: Could not fully load class: manager.administration.vehicles.VehicleTypeAdminBean
 due to:manager/vehicles/VehicleType
 in classLoader: 
org.apache.geronimo.kernel.classloader.TemporaryClassLoader@18878c7
    at org.apache.xbean.finder.ClassFinder.(ClassFinder.java:177)
    at org.apache.xbean.finder.ClassFinder.(ClassFinder.java:146)...

在web.xml中我引用了EJB:

<ejb-local-ref>
    <ejb-ref-name>ejb/VehicleTypeAdmin</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>manager.administration.vehicles.VehicleTypeAdmin</local>
    <ejb-link>VehicleTypeAdminBean</ejb-link>
</ejb-local-ref>

EJB项目具有对持久性项目的引用,而Web项目具有对这两个项目的引用。我没有得到任何编译错误,所以我认为类和引用是正确的。

我不知道它是否是应用服务器问题,但是我使用相同的配置参数在同一台服务器上运行了以前的应用程序。

有没有人知道可能是什么问题?

2 个答案:

答案 0 :(得分:1)

看起来几乎无法在尝试创建/加载类manager.administration.vehicles.VehicleTypeAdminBean时找不到类manager.vehicles.VehicleType。

之前我遇到过类似的问题。当类加载器尝试加载类时,它会查看import语句(和其他类使用声明),然后尝试加载那些类,依此类推,直到它到达链的底部(即java) .lang.Object)。如果它找不到链中的一个类(在你的情况下它看起来它不能加载VehicleType)那么它将声明它不能加载链的顶部的类(在你的情况下是VehicleTypeAdminBean)。

VehicleType类是否在另一个jar中?如果您有一个Web模块和EJB模块,那么您可以在适当的位置使用包含VehicleType类的jar。有时对于Web项目,您必须将jar放在WebContent / WEB-INF / lib文件夹中,否则它们将无法找到它们。

这两个项目是否分开部署(即两只耳朵?或一只耳朵和一只战争?)或它们是否在一起(即一只耳朵里面有罐子和内部的战争?)。我假设您第二次宣布您的EJB是本地的吗?

您所依赖的罐子也必须在使用它的项目的MANIFEST.MF文件中声明。

由于我不知道你的项目结构,我有点猜测。显示这将有所帮助。但是我仍然会检查VehicleType与EJB类相关的位置。您可能会发现它不是您认为包装或运行时的地方。

答案 1 :(得分:0)

感谢@Chris的WebContent / WEB-INF / lib创意!按照以下步骤对我有用:

1-将我的EJB导出到JAR(MyEJBs.jar) 2-我通过执行此命令,通过CMD.exe使用your_installation_path / IBM / SDP / runtimes / your_version / binCreateEJBStrub.bat创建了另一个jar:

createEJBStubs.bat <my_path>/MyEJBs.jar -newfile –quiet

3-将在与名为MyEJBs_withStubs.jar的MyEJBs.jar相同的目录中自动创建一个新jar

4-将新jar放入WebContent / WEB-INF / lib

5-通过以下方式调用EJB:

MyEJBRemote eJBRemote;
InitialContext ic = new InitialContext();
obj = ic.lookup("your_ejb_name_jndi");
eJBRemote = (MyEJBRemote ) PortableRemoteObject.narrow(obj,
MyEJBRemote.class);
eJBRemote = (MyEJBRemote ) obj;

现在您可以从另一个EAR调用您的EJB

相关问题