在 EJB 中使用 sapjco3.jar 中的类(用 @Singleton 和 @Startup 注释)时,我在 JBoss EAP 6.1 中遇到了类似的 NoClassDefFoundError 问题。
除此之外,我还收到一条错误,指出在重新发布到 EAP 或重新启动已部署的模块时,本机库已加载到另一个类加载器中。
我对这两个问题的解决方案是将 sapjco3.jar 作为全局 JBoss 模块包含在内。
Step 1
我在 EAPS 的 \modules 文件夹中创建了以下结构:
com
--> sap
--> conn
--> jco
--> main
--> module.xml
--> sapjco3.jar
的内容模块.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.sap.conn.jco">
<resources>
<resource-root path="sapjco3.jar"/>
</resources>
</module>
Step 2
将模块添加为全局模块独立.xml:
<subsystem xmlns="urn:jboss:domain:ee:1.1">
...
<global-modules>
<module name="com.sap.conn.jco" />
</global-modules>
...
</subsystem>
Step 3
创建或编辑文件jboss-部署-结构.xml在 EJB 项目 META-INF 内部包含该模块。
我的文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.sap.conn.jco" export="TRUE" />
</dependencies>
</deployment>
</jboss-deployment-structure>
Step 4
将 Maven 依赖项配置为范围provided,这样我们就可以在工作区中使用 sapjco3.jar,但不能在部署中使用它。
<dependency>
<groupId>com.sap.conn.jco</groupId>
<artifactId>sapjco3</artifactId>
<version>3.0.10</version>
<scope>provided</scope>
</dependency>
这就是我到目前为止所记得的使其发挥作用的方法,也许这对您或其他任何人都有帮助。