我试图在试图连接到MQ和JCA资源适配器的wildfly 9上部署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使用两个jars supportjar1.jar和supportingjar2.jar,并打包在rar文件中。
我的MyCompConnector.rar的结构:
MyCompConnector.rar
|--META-INF
|--supportingjar1.jar
|--supportingjar2.jar
|--MyCompConnector.jar
我的应用程序还使用myCompConnector中的类,但这些类是使用myCompConnector.jar编译的。我使用maven 3进行构建,但不打包myCompConnector.jar或任何依赖的jar。
如果我部署它说在supportjar1.jar中的类为NoClassDefFoundError,那么我只能通过放入myApp.ear的耳朵库来添加支持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
所以我也在耳朵文件的lib文件夹中添加MyCompConnector.jar
(因此,现在我的MyCompConnector.rar已加载,而MyCompConnector.jar是从ear文件中的lib文件夹加载的)
如果我现在部署,它会显示ClassCastException:com.comp.MyCompConnector.MyCompConnectorInspector.java无法转换为com.comp.MyCompConnector.MyCompConnectorInspector.java
这是正确的,因为它是从两侧加载的。现在,我无法删除rar资源适配器,因此,如果从耳朵的库中删除jar文件,它会显示上述错误:NoClassDefFoundError MyCompConnectorInspector.java和ClassNotFoundError MyCompConnectorInspector.java。
所以现在我可以解决了。如果我添加jar删除NoClassDefFoundError,它将给我classcast异常。
在类强制转换异常的情况下,我看到从RAR的MyCompConnector.jar(当我执行-verbose = class)时加载了MyCompConnectorInspector,但是当我从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部署被视为我的耳朵文件应称为库以及RAR中包含的所有他依赖库的库。
还有一个问题:当我部署RAR时,从技术上讲它是一个模块。 (模块是我以前使用过的Jboss 5或Websphere的新概念)
我看到的一件有趣的事,如果我使用
<module name="deployment.MyCompConnector.rar" />
我已经在任何资源适配器定义的一些示例中看到它根本不会加载。如果我删除部署。然后为其创建jndi名称并将其绑定。我不知道这是否很困难。
任何帮助将不胜感激。我是Wildfly的新手,所以我仍在学习技巧。
谢谢。
附注:我什至尝试做
<global-modules>
<module name="deployment.MyCompConnector.rar" />
</global-modules>
但是它只给了我无法加载模块:deployment.MyCompConnector.rar:main
然后ModuleNotFoundException:deployment.MyCompConnector.rar:main
我通过控制台而不是通过在modules文件夹中创建模块来部署rar,然后在standalone-full.xml的resourceAdppaters中添加了连接定义。这与我部署wmq.jmsra.rar文件,然后进行连接定义相同。
最佳答案
当从jar中(在模块中)或从耳朵内部的jar中引用资源适配器时,Wildfly中似乎存在一个问题。在战争中效果很好。
当我假设WF9中存在问题时,我可能会弄错。但我成功了。我的耳朵和罐子都有这个问题。
以防万一,我只是将耳朵变成一场战争,然后将我的EJB作为罐子插入到War的WEB-INF / lib文件夹中。而且没有任何问题。
希望它将对那些拥有RAR资源适配器并且正在使用资源适配器的连接类作为Ear项目的EJB内部库的人有所帮助。