2017-02-20 10 views
1

私はJava EEプロジェクト(以下の設定)に取り組んでおり、通常の例外であると思われるものに直面しています:java.lang.ClassNotFoundException: com.mysql.jdbc.DrivereclipseとTomcatを使用したJava EE:ドライバが見つかりません

Tomcat 7とMavenが埋め込まれたEclipseで作業していますが、テスト用にドライバが見つかったとしてもTomcatでは見つかりませんでした。

私はいくつかの回答123検索が、アドバイスは不明であった。 mysql-connector-javaprovidedに変更し、手動でサーバーに依存関係をコピーすることをお勧めします(どのように明確ではありません)。

しかし、私は配備の依存関係(スコープprovided)を除外して手動で追加する必要があるのはわかりませんが、矛盾していませんか?

Maven documentationを読んだ後は、実行環境が依存関係を必要としているように感じるので、compileのスコープが最適です。

私はこれらのことを理解しようとしていますが、私はむしろ魔法の修正よりも説明をしたいと思います。

構成:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.26</version> 
</dependency> 

データベースプロパティ:

  • URL = jdbc:mysql://127.0.0.1:3306/XXX-db?zeroDateTimeBehavior=convertToNull
  • USERBD = XXX
  • PASSWORDBD = XXX
  • DRIVER = com.mysql.jdbc.Driver
  • ロード

プロパティ:

static { 
    try { 

     Properties databaseProperties = new Properties(); 
     InputStream inputStream = DatabaseConnection.class.getClassLoader() 
       .getResourceAsStream(PROPERTIES_FILE); 
     if (inputStream != null) { 
      databaseProperties.load(inputStream); 
     } else { 
      throw new FileNotFoundException(
        "property file '" + PROPERTIES_FILE + "' not found in the classpath"); 
     } 
     Class.forName(databaseProperties.getProperty("DRIVER")); 
     USERBD = databaseProperties.getProperty("USERBD"); 
     PASSWORDBD = databaseProperties.getProperty("PASSWORDBD"); 
     URL = databaseProperties.getProperty("URL"); 
    } catch (ClassNotFoundException | IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

アプリケーションサーバーがTomcat IIRCでデフォルトではそうでない場合を除いて、誰かがWARにJDBCドライバを埋め込まないように推奨する理由はわかりません。デフォルトのスコープ( 'compile')で動作するなら、そのまま残しておきます。 –

+1

Tomcatには接続プールが用意されています。これは、すべての深刻なwebアプリケーションに必須のものです。したがって、あなたの戦争で接続プールを持っていない場合は、提供されているように依存関係をマークし、Tomcatのライブラリに追加して、tomcatのドキュメントで説明されているようにTomcat接続プールを設定するのが良いでしょう。もう1つの利点は、接続プールの設定を調整するために戦争を再構築する必要がないことです。しかし、あなたの戦争で適切に設定された接続プールを持っていれば、それも問題ありません。 –

答えて

1

Tomcat 7 JNDI docsはあなたに答えを与える:Tomcatの/ libフォルダに入れて。

のApache Tomcatの に含まれているJREメモリリーク防止リスナーは、ドライバーがTomcatの 起動時にスキャンをトリガすることにより、これを解決します。これはデフォルトで有効になっています。つまり、$ CATALINA_BASE/libにあるライブラリー だけがリスナーに表示され、 がデータベース・ドライバー用にスキャンされることを意味します。この 機能を無効にすることを検討している場合、このWeb アプリケーションがリロードされたときにエラーが発生し、 この機能に依存する他のWebアプリケーションでは、JDBCを使用している最初のWeb アプリケーションによってスキャンがトリガーされることに注意してください。

したがって、 WEB-INF/libディレクトリにデータベースドライバを持つWebアプリケーションは、サービスプロバイダメカニズム に依存することができず、ドライバを明示的に登録する必要があります。

+0

ありがとうございます、私はtomcatのドキュメントを読んで、あなたのソリューションに従います。 – slonepi

関連する問題