[英]Wildfly Class Loading issue with jca resourceadapter
我試圖在試圖連接到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的耳朵庫來添加支持罐(使戰爭成為一場枯燥的戰爭,並且支持罐僅在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的新手,所以我仍在學習技巧。
謝謝。
PS:我什至嘗試做
<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內部庫的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.