Java EJB的类加载器问题

Java EJB的类加载器问题,java,jakarta-ee,ejb,classloader,geronimo,Java,Jakarta Ee,Ejb,Classloader,Geronimo,我正在从事一个项目,其中包括持久性库(JPA1.2)、EJB3和Web表示层(JSF)。我使用Eclipse开发应用程序,应用程序通过Eclipse插件发布在WebSphereApplicationServerCommunityEdition(Geronimo2.1.4)上(但如果我手动发布,也会发生同样的情况)。发布到服务器时,我收到以下错误: java.lang.NoClassDefFoundError: Could not fully load class: manager.adminis

我正在从事一个项目,其中包括持久性库(JPA1.2)、EJB3和Web表示层(JSF)。我使用Eclipse开发应用程序,应用程序通过Eclipse插件发布在WebSphereApplicationServerCommunityEdition(Geronimo2.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/VehicleTypeAdmin
一场
manager.administration.vehicles.VehicleTypeAdmin
VehicleTypeAdminBean
EJB项目引用了持久性项目,Web项目引用了这两个项目。我没有得到任何编译错误,所以我认为类和引用是正确的

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


有人知道问题出在哪里吗?

在尝试创建/加载类manager.administration.vehicles.VehicleTypeAdminBean时,似乎找不到类manager.vehicles.VehicleType

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

VehicleType类在不同的jar中吗?如果您有一个web模块和EJB模块,那么在适当的位置是否有包含VehicleType类的jar。有时,对于web项目,您必须将JAR放在WebContent/web-INF/lib文件夹中,否则它将找不到它们

这两个项目是分开部署的(即两个耳朵?还是一个耳朵和一场战争?)还是一起部署的(即一个耳朵带着罐子,里面有一场战争?)。我假设第二个假设您声明了EJB本地

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


因为我不知道你的项目结构,所以我有点猜测。展示这一点会有很大帮助。但我仍然会检查VehicleType在EJB类中的位置。您可能会发现它并不是来自打包或运行时。

在尝试创建/加载类manager.administration.vehicles.VehicleTypeAdminBean时,它几乎找不到类manager.VehicleType

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

VehicleType类在不同的jar中吗?如果您有一个web模块和EJB模块,那么在适当的位置是否有包含VehicleType类的jar。有时,对于web项目,您必须将JAR放在WebContent/web-INF/lib文件夹中,否则它将找不到它们

这两个项目是分开部署的(即两个耳朵?还是一个耳朵和一场战争?)还是一起部署的(即一个耳朵带着罐子,里面有一场战争?)。我假设第二个假设您声明了EJB本地

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


因为我不知道你的项目结构,所以我有点猜测。展示这一点会有很大帮助。但我仍然会检查VehicleType在EJB类中的位置。您可能会发现它并不是来自于打包或运行时。

感谢@Chris提供WebContent/WEB-INF/lib创意!它通过以下步骤对我有效:

1-将我的EJB导出到JAR(MyEJBs.JAR) 2-我通过CMD.exe使用您的安装路径/IBM/SDP/runtimes/your_version/bincreatejbstrub.bat创建了另一个jar,方法是执行以下命令:

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

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

感谢@Chris提供WebContent/WEB-INF/lib创意!它通过以下步骤对我有效:

1-将我的EJB导出到JAR(MyEJBs.JAR) 2-我通过CMD.exe使用您的安装路径/IBM/SDP/runtimes/your_version/bincreatejbstrub.bat创建了另一个jar,方法是执行以下命令:

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

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

谢谢您的回复。是的,您是对的,我在类路径中缺少带有VehicleType类的jar。我引用了它,但在部署中忽略了它。当我在eclipse中将它添加到export时,它被添加到classpath中,并且没有发生类加载错误,所以问题得到了解决。谢谢您的回复。是的,您是对的,我在类路径中缺少带有VehicleType类的jar。我引用了它,但在部署中忽略了它。当我在eclipse中将它添加到export中时,它被添加到类路径中,并且没有发生类加载错误,因此问题得到了解决。