使用jca resourceadapter

时间:2015-10-21 02:51:10

标签: java classloader classnotfoundexception wildfly-8

我正在尝试在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文件相同,然后进行了连接定义。

1 个答案:

答案 0 :(得分:1)

当从jar(模块中)或耳内jar引用资源适配器时,Wildfly似乎存在问题。在战争中它运作良好。 当我假设在WF9中存在问题时,我可能会弄错。但我让它发挥作用。我有这个问题,如果是耳朵和罐子。

如果是耳朵,我只是简单地将耳朵转换为战争并将我的EJB插入War的WEB-INF / lib文件夹中作为jar。它没有任何问题。

希望它能帮助一个拥有RAR资源适配器并且正在使用资源适配器的连接类作为ear项目的EJB内部库的人。