2017-06-26 8 views
0

現在、TomcatからWildfly 10サーバーに移行しています。私たちはJava EE Serverの利点を利用したいと考えています。現在、DataSourceにいくつかの問題があります。 WildflyにJDBCドライバをデプロイし、DataSourceをセットアップしました。 これは主にうまく機能しますが、データベース側のイベントにはDatabaseQueryNotification(Oracle)を使用します。今WepAppで使用できるワイルドフライにJDBCドライバをデプロイする方法

私はに実行する問題:私は私の戦争でドライバをパッケージ化すると

(加えて)、私は理由T4ConnectionとのOracleConnectionの不一致のClassCastExceptionが得られます。したがって、私は戦争からJDBC-Driverを削除しました(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) 
+1

あなたは間違いでドライバをパッケージ化する必要はありませんあなたのWAR。ドライバ用のモジュールを追加したかJARを導入しましたか?あなたのケースでは、モジュールを作成したいと思うでしょう。 –

+0

JARを管理コンソールからデプロイしました。 – TooR

+2

管理コンソールを使用してデプロイされたJARファイルは、構成ファイルで定義されたデータソースで使用できます。 JDBCドライバクラスをWebアプリケーションで使用できるようにしたい場合は、モジュールを作成するか、WebappクラスパスにJDBCドライバjarを追加する必要があります。 – Abhijit

答えて

0

私は問題を解決した:

  1. 私はモジュールとしてJDBCドライバを展開する必要がありました(参照: http://hpehl.info/jdbc-driver-setup.html
  2. 私が必要oracle.jdbc.dcn *ファイルをエクスポートする必要があり、モジュールから
  3. Manifest.MFファイルに依存関係を挿入します。

module.xml(Mavenをすることによって行うことができ、以下を参照)

<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> 

のpom.xml

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>3.1.0</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
      <Dependencies>com.oracle</Dependencies> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 
-1

あなたはJNDIを通じてデータソースのインスタンスを取得したり、CDIを通じて注入しなければなりません。

+0

JNDI経由でDataSourceを取得しますが、これは問題ではありません。エラーは、クラスで実装しているoracle/jdbc/dcn/DatabaseChangeListenerが見つかりません。 – TooR

+0

Irrcあなたが得ている接続はorg.jboss.jca.adapters.jdbc.WrappedConnectionであり、そこから実際の接続を取得する必要があります – ehsavoie

+0

接続は私の問題ではありません。 JDBC実装、特にDatabaseChangeListener(oracle.jdbc.dcn.DatabaseChangeListene)が見つからないため、アプリケーションは現在Deploy-Timeに失敗します。私はsevral orcacle.jndi.dcn。* Classesをインポートする必要がありますが、サーバからドライバ(jdbc7.jar)を受け取る必要があります。 – TooR

関連する問題