1

我正在开发一个包含持久性库 (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 项目引用了这两个项目。我没有收到任何编译错误,所以我认为类和引用是正确的。

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

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

4

2 回答 2

1

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

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

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

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

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

由于我不知道您的项目结构,因此我有点猜测。表明这一点会有很大帮助。但我仍然会检查关于您的 EJB 类的 VehicleType 的位置。您可能会发现它不是您认为它来自打包或运行时的地方。

于 2010-08-11T19:33:59.640 回答
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.jar 相同的目录中自动创建一个新 jar,名为 MyEJBs_withStubs.jar

4-把你的新罐子放在 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

于 2013-09-18T09:32:43.150 回答