Eclipse发布WebSphere应用时EJB-in-WAR出现类找不到异常
解决Eclipse发布EAR到WebSphere时的ClassNotFoundException问题
问题分析
通过mvn install构建的EAR能正常部署到WebSphere,说明依赖关系和EAR结构是正确的,但Eclipse发布时出现ClassNotFoundException,核心原因是Eclipse的发布机制没有正确将datamodel.jar(包含EmployeeDto类)纳入应用的类路径,导致WebSphere容器无法找到该类。
解决方案
1. 显式添加datamodel依赖到EAR模块的pom.xml
当前EAR的pom仅声明了ejb和web模块依赖,虽然ejb依赖datamodel,但Eclipse的Maven集成可能不会自动将传递依赖的jar包纳入EAR的lib目录。需在EAR的<dependencies>中添加datamodel的依赖:
<dependency> <groupId>com.example</groupId> <artifactId>datamodel</artifactId> <version>0.0.1-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency>
2. 检查Eclipse的Deployment Assembly配置
确保每个模块的部署配置正确:
- EAR项目:右键项目 →
Properties→Deployment Assembly,确认datamodel.jar被部署到/lib目录下。 - EJB/WAR项目:由于开启了
skinnyWars,需确保datamodel.jar未被打包到EJB或WAR的内部目录(如WEB-INF/lib),而是指向EAR的lib目录。
3. 调整WebSphere服务器的发布设置
- 在Eclipse的
Server视图中,右键WebSphere服务器 →Properties→WebSphere Application Server > Publishing。 - 选择Full publish(而非增量发布),确保所有依赖文件被完整复制到服务器。
- 勾选
Automatically publish to server,并确认使用Maven生成的应用配置文件。
4. 验证application.xml的生成内容
检查Maven生成的application.xml(位于EAR项目的target/META-INF目录),确保包含以下配置,保证EAR/lib下的jar包能被所有模块访问:
<library-directory>lib</library-directory>
(注:你的maven-ear-plugin配置中已设置defaultLibBundleDir: lib/,理论上会自动生成该配置,但需确认Eclipse发布时使用的是这个文件而非自动生成的临时配置。)
5. 清理重建项目与服务器
- 执行
mvn clean install,确保所有模块的最新构建产物生成。 - 在Eclipse中执行
Project > Clean...,清理所有项目的编译缓存。 - 右键WebSphere服务器 →
Clean...,清除服务器上已部署的旧应用,重启服务器后重新发布。
6. 调整WebSphere的类加载策略
若以上步骤无效,可尝试修改WebSphere的类加载配置:
- 登录WebSphere控制台,进入
Applications > Application Types > WebSphere enterprise applications > [你的应用] > Class loading and update detection。 - 将Class loader order设置为
Classes loaded with local class loader first (parent last)。 - 将WAR class loader policy设置为
Single class loader for application。
内容的提问来源于stack exchange,提问作者Mohammed Mostafa
相关产品推荐
相关产品推荐

