簡體   English   中英

jca resourceadapter的Wildfly類加載問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM