我正在尝试在wildfly 9上部署一个试图连接到MQ和JCA资源适配器的ear应用程序。
我的耳文的结构
myApp.ear
|--lib/
|----Spring.jar (Multiple jars for different modules needed)
|----META-INF/
|--myAppEJB.jar (EJB project)
|--myAppWeb.war
|--jboss-deployment-structure.xml
JCA资源适配器(myCompConnector.rar)打包为rar,并在其中部署了ra.xml。 myCompConnector使用两个jar支持jar1.jar和supportsjar2.jar,并打包在rar文件中。 MyCompConnector.rar的结构:
MyCompConnector.rar
|--META-INF
|--supportingjar1.jar
|--supportingjar2.jar
|--MyCompConnector.jar
我的应用程序也使用myCompConnector中的类,但是使用myCompConnector.jar编译。我使用maven 3进行构建,并且我不打包myCompConnector.jar或任何依赖的jar。
如果我部署它,对于支持jar1.jar中的一个类说NoClassDefFoundError,那么我只通过放入耳朵myApp.ear的lib来添加支持的jar(使战争成为一场瘦弱的战争以及支持jar只使用在EJB项目的pom文件中不在WAR中)
然后,如果我在wildfly上部署它,它会说NoClassDefFoundError MyCompConnectorInspector.java和ClassNotFoundError MyCompConnectorInspector.java。 MyCompConnectorInspector是MyCompConnector.jar中的一个类,它也出现在MyCompConnector.rar中。
Caused by: java.lang.NoClassDefFoundError: Lcom/myComp/MyCompConnector/MyCompConnectorInspector ;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2317)
at java.lang.Class.getDeclaredFields(Class.java:1762)
at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:57)
at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:66)
... 10 more
Caused by: java.lang.ClassNotFoundException: com.mycomp.MyCompConnector.MyCompConnectorInspector from [Module "deployment.myApp-1.3.ear.myAppEJB-1.3.jar:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:130)
... 15 more
所以我也将MyCompConnector.jar添加到ear文件的lib文件夹中 (所以现在我的MyCompConnector.rar被加载,MyCompConnector.jar从ear文件中的lib文件夹加载)
如果我现在部署它说ClassCastException:com.comp.MyCompConnector.MyCompConnectorInspector.java无法强制转换为com.comp.MyCompConnector.MyCompConnectorInspector.java
这是真的,因为它从两侧加载。现在我无法删除rar资源适配器,所以如果我从耳朵的lib中删除jar文件,它会说上面提到的错误:NoClassDefFoundError MyCompConnectorInspector.java和ClassNotFoundError MyCompConnectorInspector.java。
所以现在我正在解决问题。如果我添加jar来删除NoClassDefFoundError它会给我一个classcast异常。
在类强制转换异常的情况下,我看到MyCompConnectorInspector是从RAR的MyCompConnector.jar加载的(当我执行-verbose = class时),但是当我从myApp / lib /中删除jar文件时,我看不到MyCompConnectorInspector是从RAR的MyCompConnector.jar加载的。
我在ear文件中的jboss-deployment-structure看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="MyCompConnector.rar" />
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="javax.jms.api"/>
<!--<module name="com.compConnector.supportingjar1"/>
<module name="com.compConnector.supportingjar2"/> -->
</dependencies>
</deployment>
</jboss-deployment-structure>
如何将rar部署视为我的ear文件应该称为库以及RAR中包含的所有依赖库的内容。
还有一个问题:当我部署RAR时,它在技术上是一个模块。 (模块对我来说是Jboss 5或websphere的一个新概念,我之前曾与之合作过)
我看过一个有趣的事情,如果我使用
<module name="deployment.MyCompConnector.rar" />
我在任何资源适配器定义中的一些示例中看到它根本不加载。如果我删除部署。然后它为它创建jndi名称并绑定它。我不知道它是否相关强硬。 任何帮助将不胜感激。我是Wildfly的新手,所以我还在学习它的技巧。
感谢。
P.S:我甚至试图做
<global-modules>
<module name="deployment.MyCompConnector.rar" />
</global-modules>
但它只给了我加载模块失败:deployment.MyCompConnector.rar:main 然后是ModuleNotFoundException:deployment.MyCompConnector.rar:main
我通过控制台部署了rar,而不是通过在modules文件夹中创建模块,然后在standalone-full.xml中的resourceAdppaters中添加了连接定义。这与我部署了wmq.jmsra.rar文件相同,然后进行了连接定义。
答案 0 :(得分:1)
当从jar(模块中)或耳内jar引用资源适配器时,Wildfly似乎存在问题。在战争中它运作良好。 当我假设在WF9中存在问题时,我可能会弄错。但我让它发挥作用。我有这个问题,如果是耳朵和罐子。
如果是耳朵,我只是简单地将耳朵转换为战争并将我的EJB插入War的WEB-INF / lib文件夹中作为jar。它没有任何问题。
希望它能帮助一个拥有RAR资源适配器并且正在使用资源适配器的连接类作为ear项目的EJB内部库的人。