Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JDBC驱动程序部署到WebApp可以使用的Wildfly_Jdbc_Wildfly_Wildfly 10 - Fatal编程技术网

如何将JDBC驱动程序部署到WebApp可以使用的Wildfly

如何将JDBC驱动程序部署到WebApp可以使用的Wildfly,jdbc,wildfly,wildfly-10,Jdbc,Wildfly,Wildfly 10,我们目前正在从Tomcat迁移到Wildfly 10服务器。我们喜欢利用JavaEE服务器。目前,我们在数据源方面存在一些问题。我们已经在Wildfly上部署了JDBC驱动程序并设置了数据源。 这基本上是好的,但是我们喜欢使用DatabaseQueryNotification(Oracle)来处理数据库端事件 现在我遇到的问题是: 当我用war打包驱动程序时(另外),由于T4Connection和OracleConnection不匹配,我得到一个ClassCastException。因此,我从W

我们目前正在从Tomcat迁移到Wildfly 10服务器。我们喜欢利用JavaEE服务器。目前,我们在数据源方面存在一些问题。我们已经在Wildfly上部署了JDBC驱动程序并设置了数据源。 这基本上是好的,但是我们喜欢使用DatabaseQueryNotification(Oracle)来处理数据库端事件

现在我遇到的问题是:

当我用war打包驱动程序时(另外),由于T4Connection和OracleConnection不匹配,我得到一个ClassCastException。因此,我从War中删除了JDBC驱动程序(maven->scope:provided)。但是现在我的应用程序在部署时失败了,因为NoClassDefFound(参见下面的Stacktrace)

如何确保应用程序可以找到JDBC驱动程序

Java代码段:

public class DBListener implements IDBListener, Runnable, DatabaseChangeListener, IPropertyListener, Serializable {  
     @Resource(lookup = "java:/PlsDS")  
     private DataSource dataSource;  
     ...  
     public void connectToDB(){
       Connection tmpCon = dataSource.getConnection();  
       connection = (OracleConnection) tmpCon.getMetaData().getConnection();  
       ...
     }
}
堆栈跟踪:

14:32:59,869 WARN  [org.jboss.modules] (MSC service thread 1-7) Failed to define class de.istec.pls.client.db.listener.DBListener in Module "deployment.client.pls-sc-1.0.0-SNAPSHOT.war:main" from Service Module Loader: java.lang.NoClassDefFoundError: Failed to link de/istec/pls/client/db/listener/DBListener (Module "deployment.client.pls-sc-1.0.0-SNAPSHOT.war:main" from Service Module Loader): oracle/jdbc/dcn/DatabaseChangeListener
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:446)
    at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:274)
    at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:78)
    at org.jboss.modules.Module.loadModuleClass(Module.java:606)
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
    at org.wildfly.extension.undertow.deployment.ServletContainerInitializerDeploymentProcessor.loadClassInfoSet(ServletContainerInitializerDeploymentProcessor.java:259)
    at org.wildfly.extension.undertow.deployment.ServletContainerInitializerDeploymentProcessor.deploy(ServletContainerInitializerDeploymentProcessor.java:169)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:147)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

14:32:59,871 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC000001: Failed to start service jboss.deployment.unit."client.pls-sc-1.0.0-SNAPSHOT.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."client.pls-sc-1.0.0-SNAPSHOT.war".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of deployment "client.pls-sc-1.0.0-SNAPSHOT.war"
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:154)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.NoClassDefFoundError: Failed to link de/istec/pls/client/db/listener/DBListener (Module "deployment.client.pls-sc-1.0.0-SNAPSHOT.war:main" from Service Module Loader): oracle/jdbc/dcn/DatabaseChangeListener
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:446)
    at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:274)
    at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:78)
    at org.jboss.modules.Module.loadModuleClass(Module.java:606)
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
    at org.wildfly.extension.undertow.deployment.ServletContainerInitializerDeploymentProcessor.loadClassInfoSet(ServletContainerInitializerDeploymentProcessor.java:259)
    at org.wildfly.extension.undertow.deployment.ServletContainerInitializerDeploymentProcessor.deploy(ServletContainerInitializerDeploymentProcessor.java:169)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:147)

您应该通过JNDI或CDI获取数据源的实例。

我已经解决了这个问题:

  • 我不得不将JDBC驱动程序作为一个模块进行部署(请参阅: )
  • 我必须从模块中导出所需的oracle.jdbc.dcn*文件
  • 在Manifest.MF文件中插入依赖项。(可由Maven完成,见下文)
  • module.xml

    <module xmlns="urn:jboss:module:1.1" name="com.oracle">
      <resources>
        <resource-root path="ojdbc7-12.1.0.2.jar"/>
      </resources>
      <dependencies>
        <system export="true">
            <paths>
                <path name="oracle/jdbc/OracleStatement"/>
                <path name="oracle/jdbc/dcn/DatabaseChangeEvent"/>
                <path name="oracle/jdbc/dcn/DatabaseChangeListener"/>
                <path name="oracle/jdbc/dcn/DatabaseChangeRegistration"/>
                <path name="oracle/jdbc/dcn/QueryChangeDescription"/>
                <path name="oracle/jdbc/dcn/RowChangeDescription"/>
            </paths>
        </system>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
      </dependencies>
    </module>
    
    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
            <archive>
              <manifestEntries>
                 <Dependencies>com.oracle</Dependencies>
              </manifestEntries>
            </archive>
        </configuration>
    </plugin>
    
    
    
    pom.xml

    <module xmlns="urn:jboss:module:1.1" name="com.oracle">
      <resources>
        <resource-root path="ojdbc7-12.1.0.2.jar"/>
      </resources>
      <dependencies>
        <system export="true">
            <paths>
                <path name="oracle/jdbc/OracleStatement"/>
                <path name="oracle/jdbc/dcn/DatabaseChangeEvent"/>
                <path name="oracle/jdbc/dcn/DatabaseChangeListener"/>
                <path name="oracle/jdbc/dcn/DatabaseChangeRegistration"/>
                <path name="oracle/jdbc/dcn/QueryChangeDescription"/>
                <path name="oracle/jdbc/dcn/RowChangeDescription"/>
            </paths>
        </system>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
      </dependencies>
    </module>
    
    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
            <archive>
              <manifestEntries>
                 <Dependencies>com.oracle</Dependencies>
              </manifestEntries>
            </archive>
        </configuration>
    </plugin>
    
    
    maven战争插件
    3.1.0
    com.oracle
    
    我通过JNDI获取数据源,这不是问题所在。错误表示找不到我用类实现的oracle/jdbc/dcn/DatabaseChangeListener。Irrc您获得的连接是org.jboss.jca.adapters.jdbc.WrappedConnection,您需要从中获得“真实”连接。连接不是我的问题。应用程序当前在部署时失败,因为它找不到JDBC实现,特别是DatabaseChangeListener(oracle.JDBC.dcn.DatabaseChangeListene)。我需要导入sevral orcacle.jndi.dcn.*类,但需要从服务器接收驱动程序(jdbc7.jar)。在为驱动程序创建模块时,是否导出(使用module.xml中的exports标记)了这些包?否则这些将不可用这是缺少的提示。谢谢你肯定不想在你的战争中包装司机。您是为驱动程序添加了模块还是部署了JAR?在本例中,您可能需要为其创建一个模块。我刚刚通过管理控制台部署了JAR。通过管理控制台部署的JAR文件将可用于配置文件中定义的数据源。若要使JDBC驱动程序类可用于webapp,则必须在webapp类路径中创建模块或添加JDBC驱动程序jar