EJB 随笔<一>

       之前学习过EJB,但是好久没有使用了,由于项目关系,所以重操旧业。但是发现突然间对EJB使用不是很顺手,所以重新了解了一下EJB,这次记录下来吧。

基础知识这里就不在赘述了,google一把一把的,就说一下我比较困惑的几点


1、同一个interface,不可以在同一个实现中,既使用@Remote,又使用@Local

2、同一interface,可以在不同实现中,及使用@Remote,又使用@Local

例子:


public interface IReportDaoLocal {
public void saySomething();
}


实现1

import javax.ejb.Stateless;
@Stateless
public class ReportDaoLocal implements IReportDaoLocal {
@Override
public void saySomething() {
System.out.println("I am in ReportDaoLocal");
}
}

实现2

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote({IReportDaoLocal.class})
public class ReportDaoremote implements IReportDaoLocal {
@EJB(name="ReportDaoLocal")
private IReportDaoLocal reportlocal;

@Override
public void saySomething() {
System.out.println("i am local interface of reportDao Local");
reportlocal.saySomething();
}
}


这样实现是没有问题的,下边这种实现方式是错误的

import javax.ejb.Stateless;
@Stateless

@Local({IReportDaoLocal .class})

@Remote({IReportDaoLocal .class})
public class ReportDaoLocal implements IReportDaoLocal {
@Override
public void saySomething() {
System.out.println("I am in ReportDaoLocal");
}
}


3、如果interface 没有继承其他interface,则不可以使用@Stateless,@Local,@Remote,如果有其他继承接口,没有试验

例如:

@Stateless
public interface IReportDaoLocal {
public void saySomething();
}

这是错误的,虽然没有写@Local,只写@Stateless默认是Local端口

4、如果一个实现类,继承了另一个实现类,而另一个实现类被标注了@Stateless或者@Remote标注,在Jboss 5服务器中,第一个实现类是不会被JNDI注册的,即是说,第一个实现类不会成为服务,只是一个普通的类

打包报错了,<Jul 30, 2025, 5:50:36,784 PM China Standard Time> <Error> <Deployer> <BEA-149265> <Failure occurred in the execution of deployment request with ID "7889792369197352" for task "920" on [partition-name: DOMAIN]. Error is: "weblogic.application.ModuleException: java.lang.ClassNotFoundException: com.lkm.ejb.toolmanage.server.ToolManageEjb" weblogic.application.ModuleException: java.lang.ClassNotFoundException: com.lkm.ejb.toolmanage.server.ToolManageEjb at weblogic.application.internal.ExtensibleModuleWrapper.prepare(ExtensibleModuleWrapper.java:114) at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:100) at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleStateDriver.java:192) at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleStateDriver.java:187) at weblogic.application.utils.StateMachineDriver$ParallelChange.run(StateMachineDriver.java:83) Truncated. see log file for complete stacktrace Caused By: java.lang.ClassNotFoundException: com.lkm.ejb.toolmanage.server.ToolManageEjb at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:1035) at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:996) at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:101) at weblogic.utils.classloaders.GenericClassLoader.doFindClass(GenericClassLoader.java:617) at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:547) Truncated. see log file for complete stacktrace
最新发布
07-31
<think>根据错误信息,部署时出现了`java.lang.ClassNotFoundException: com.lkm.ejb.toolmanage.server.ToolManageEjb`,这意味着WebLogic服务器在部署时无法找到指定的EJB类。这通常是由于以下原因之: 1. **类未正确打包**:在部署的EAR或JAR文件中,可能缺少包含该类的JAR文件,或者该类没有被正确编译到预期的位置。 2. **类路径问题**:部署描述符(如`weblogic-application.xml`)中可能没有正确设置类路径,导致WebLogic无法找到该类。 3. **依赖问题**:如果这个EJB类依赖于其他库,而这些库没有正确部署或配置,也可能导致类找不到。 4. **构建问题**:在构建过程中,可能没有包含该EJB类,或者构建脚本有误。 ### 解决方案步骤 #### 1. 检查类是否存在于部署包中 首先,确认在部署的EAR文件(或WAR/JAR文件)中存在`com.lkm.ejb.toolmanage.server.ToolManageEjb`类。可以使用压缩工具打开部署包,检查相应的目录结构。 - 如果使用EAR部署,检查`APP-INF/lib`下的JAR文件或`APP-INF/classes`下的类文件。 - 如果使用EJB JAR部署,检查JAR文件中的`com/lkm/ejb/toolmanage/server/ToolManageEjb.class`是否存在。 #### 2. 检查构建路径和依赖 确保在构建项目时,包含该EJB类的模块被正确编译并打包到部署包中。检查构建脚本(如Maven的`pom.xml`或Gradle的`build.gradle`)中是否包含该模块。 #### 3. 检查部署描述符 在EAR部署中,检查`META-INF/application.xml`和`META-INF/weblogic-application.xml`,确保正确引用了包含该EJB的模块。 #### 4. 检查类加载机制 WebLogic使用类加载器层次结构。检查是否因为类加载器隔离导致的问题。可以尝试在`weblogic-application.xml`中设置`<prefer-application-packages>`或`<prefer-application-resources>`来确保使用应用程序中的类。 例如,在`weblogic-application.xml`中添加: ```xml <weblogic-application> <prefer-application-packages> <package-name>com.lkm.ejb.toolmanage.server.*</package-name> </prefer-application-packages> </weblogic-application> ``` #### 5. 清理和重新构建 有时,旧的构建产物可能导致问题。清理项目并重新构建整个项目,然后重新部署。 ### 示例:检查部署包结构 假设项目结构如下: ``` my-app.ear ├── META-INF │ ├── application.xml │ └── weblogic-application.xml ├── my-ejb-module.jar # 应该包含ToolManageEjb类 └── my-web-module.war ``` 在`my-ejb-module.jar`中,应该有: ``` com/lkm/ejb/toolmanage/server/ToolManageEjb.class ``` ### 修复构建配置(Maven示例) 如果使用Maven,确保EJB模块的`pom.xml`正确配置了打包类型为`ejb`,并且依赖项正确。 ```xml <project> <modelVersion>4.0.0</modelVersion> <groupId>com.lkm</groupId> <artifactId>my-ejb-module</artifactId> <version>1.0.0</version> <packaging>ejb</packaging> <dependencies> <!-- 必要的依赖 --> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <version>3.0.1</version> <configuration> <ejbVersion>3.2</ejbVersion> </configuration> </plugin> </plugins> </build> </project> ``` ### 重新部署 完成上述检查后,重新部署应用程序。 ### 如果问题仍然存在 考虑在WebLogic服务器上启用类加载调试,以获取更详细的信息。在WebLogic控制台,设置`-verbose:class` JVM参数,然后重新部署,观察日志中是否有加载该类的尝试。 ### 总结 该错误通常是由于类文件缺失或类加载问题引起的。通过检查部署包、构建配置和部署描述符,大多数问题可以解决。 §§相关问题§§: 1. 如何解决WebLogic部署时出现的ClassNotFoundException? 2. 在WebLogic中如何配置类加载机制以避免类冲突? 3. Maven构建EAR项目时如何正确配置模块依赖? 4. 如何调试WebLogic的类加载问题?</think>### 解决 WebLogic 部署中的 ClassNotFoundException 问题 您遇到的错误是典型的类加载问题,具体是 `com.lkm.ejb.toolmanage.server.ToolManageEjb` 类在部署时找不到。以下是完整的解决方案: #### 原因分析: 1. **类未打包**:EJB 类未包含在部署包中 2. **类路径问题**:类路径配置不正确 3. **依赖缺失**:缺少必要的依赖库 4. **部署描述符错误**:`ejb-jar.xml` 或 `weblogic-ejb-jar.xml` 配置错误 5. **类加载器问题**:WebLogic 类加载器层次结构问题 --- ### 解决方案: #### 1. 检查类是否打包 确认 EJB 类已编译并包含在部署包中: ```bash # 检查 WAR/EAR 文件内容 jar tf your-application.ear | grep ToolManageEjb # 或检查目录结构 unzip -l your-application.ear ``` 如果类不存在,需要修复构建配置: **Maven pom.xml 修复示例**: ```xml <build> <plugins> <!-- 确保 EJB 模块被正确打包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <version>3.0.1</version> <configuration> <ejbVersion>3.2</ejbVersion> <!-- 包含所有类 --> <include>**/*.class</include> </configuration> </plugin> <!-- EAR 打包配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ear-plugin</artifactId> <version>3.0.1</version> <configuration> <modules> <ejbModule> <groupId>com.lkm</groupId> <artifactId>toolmanage-ejb</artifactId> <!-- 确保包含在 EAR 的 APP-INF/lib --> <bundleDir>APP-INF/lib</bundleDir> </ejbModule> </modules> </configuration> </plugin> </plugins> </build> ``` #### 2. 修复类加载器配置 在 `weblogic-application.xml` 中添加类加载器配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"> <application-param> <param-name>webapp.encoding.default</param-name> <param-value>UTF-8</param-value> </application-param> <!-- 关键配置:优先加载应用类 --> <prefer-application-packages> <package-name>com.lkm.ejb.*</package-name> </prefer-application-packages> <classloader-structure> <module-ref> <module-uri>toolmanage-ejb.jar</module-uri> </module-ref> </classloader-structure> </weblogic-application> ``` #### 3. 检查 EJB 部署描述符 确保 `ejb-jar.xml` 和 `weblogic-ejb-jar.xml` 配置正确: **ejb-jar.xml**: ```xml <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <enterprise-beans> <session> <ejb-name>ToolManageEjb</ejb-name> <ejb-class>com.lkm.ejb.toolmanage.server.ToolManageEjb</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> ``` **weblogic-ejb-jar.xml**: ```xml <weblogic-ejb-jar xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar"> <weblogic-enterprise-bean> <ejb-name>ToolManageEjb</ejb-name> <jndi-name>ejb/ToolManageEjb</jndi-name> </weblogic-enterprise-bean> </weblogic-ejb-jar> ``` #### 4. 验证依赖管理 确保所有依赖项正确包含在 `lib` 目录中: ```bash your-application.ear ├── META-INF │ ├── application.xml │ └── weblogic-application.xml ├── toolmanage-ejb.jar # 包含 ToolManageEjb └── lib ├── common-lib1.jar └── common-lib2.jar ``` 在 `application.xml` 中配置库目录: ```xml <application xmlns="http://java.sun.com/xml/ns/javaee"> <module> <ejb>toolmanage-ejb.jar</ejb> </module> <library-directory>lib</library-directory> </application> ``` #### 5. 部署后检查 如果部署后仍然报错,使用 WebLogic 控制台检查类加载器: 1. 登录 WebLogic 控制台 2. 转到 `部署 > 您的应用` 3. 点击 "测试" 选项卡 4. 运行 "类加载器查看器" 5. 检查 `com.lkm.ejb.toolmanage.server.ToolManageEjb` 是否在类路径中 --- ### 完整排查流程: ```mermaid graph TD A[部署失败] --> B[检查部署包内容] B -->|类缺失| C[修复构建配置] B -->|类存在| D[检查类加载器配置] D --> E[检查 weblogic-application.xml] E --> F[添加 prefer-application-packages] F --> G[检查部署描述符] G --> H[验证 ejb-jar.xml] H --> I[验证 weblogic-ejb-jar.xml] I --> J[检查依赖管理] J --> K[确保依赖在 lib 目录] K --> L[重新部署] L --> M[测试应用] ``` --- ### 高级解决方案:使用部署计划 如果问题仍然存在,创建部署计划文件: 1. 创建 `plan/Plan.xml`: ```xml <?xml version='1.0' encoding='UTF-8'?> <deployment-plan xmlns="http://xmlns.oracle.com/weblogic/deployment-plan"> <application-name>your-app</application-name> <variable-definition> <variable> <name>EJB_CLASS</name> <value>com.lkm.ejb.toolmanage.server.ToolManageEjb</value> </variable> </variable-definition> <module-override> <module-name>toolmanage-ejb.jar</module-name> <module-type>ejb</module-type> <module-descriptor external="false"> <root-element>ejb-jar</root-element> <uri>META-INF/ejb-jar.xml</uri> </module-descriptor> </module-override> </deployment-plan> ``` 2. 使用部署计划部署: ```bash java weblogic.Deployer -adminurl t3://localhost:7001 \ -username weblogic -password welcome1 \ -deploy -plan plan/Plan.xml your-application.ear ``` --- ### 最终验证: 部署成功后,使用 WebLogic 的 `wlst` 工具验证 EJB 是否可用: ```python connect('weblogic', 'welcome1', 't3://localhost:7001') ejb_name = 'ToolManageEjb' try: bean = getEJB(ejb_name) print('EJB Found:', bean) print('JNDI Name:', bean.getJNDIName()) except: print('EJB not found! Check deployment.') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值