2017-02-20 68 views
1

我正在開發一個Java EE項目(下面的配置),我面對的是一個看起來經常發生的異常:java.lang.ClassNotFoundException: com.mysql.jdbc.Drivereclipse和Tomcat的Java EE:驅動程序未找到

我正在使用Eclipse,一個嵌入式Tomcat 7和Maven,並且即使找到了用於測試的驅動程序,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

我不確定爲什麼有人會建議不要將JDBC驅動程序嵌入到WAR中,除非應用程序服務器已經提供了它們(默認情況下Tomcat IIRC不是這種情況)。如果它與默認範圍('compile')一起工作,我會保持原樣。 –

+1

Tomcat提供了一個連接池,這是任何嚴重的web應用程序必須具備的。所以如果你沒有,在你的戰爭中配置和使用連接池,你最好標記所提供的依賴關係,將它添加到tomcat的庫中,並按照tomcat文檔中的說明配置tomcat連接池。另一個優點是連接池設置的調整不需要重建戰爭。但是如果你的戰爭中有一個正確配置的連接池,那也沒關係。 –

回答

1

Tomcat 7 JNDI docs給你答案:把他們在Tomcat/lib文件夾。附帶的Apache Tomcat的

JRE內存泄漏防禦監聽器通過觸發的Tomcat 啓動過程中驅動程序掃描解決這個問題。這是默認啓用的。這意味着只有監聽器可見的庫(例如$ CATALINA_BASE/lib中的文件庫)纔會被 掃描以查找數據庫驅動程序。如果您正在考慮禁用此功能,請注意,掃描將由使用JDBC的第一個Web 應用程序觸發,導致此Web 應用程序重新加載時失敗,並導致依賴此功能的其他Web應用程序導致失敗。

因此,WEB-INF/lib目錄中具有數據庫驅動程序的Web應用程序不能依賴服務提供者機制 ,並且應該明確註冊驅動程序。

+0

謝謝,我將閱讀tomcat文檔並遵循您的解決方案。 – slonepi