我正在開發一個Java EE項目(下面的配置),我面對的是一個看起來經常發生的異常:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
。eclipse和Tomcat的Java EE:驅動程序未找到
我正在使用Eclipse,一個嵌入式Tomcat 7和Maven,並且即使找到了用於測試的驅動程序,Tomcat也找不到它。
我搜索了一些答案1,2和3,但建議不明確: 建議改變mysql-connector-java
到provided
,並手動複製到服務器的依賴(還不清楚)。
但我不明白爲什麼我應該排除依賴部署(範圍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();
}
}
我不確定爲什麼有人會建議不要將JDBC驅動程序嵌入到WAR中,除非應用程序服務器已經提供了它們(默認情況下Tomcat IIRC不是這種情況)。如果它與默認範圍('compile')一起工作,我會保持原樣。 –
Tomcat提供了一個連接池,這是任何嚴重的web應用程序必須具備的。所以如果你沒有,在你的戰爭中配置和使用連接池,你最好標記所提供的依賴關係,將它添加到tomcat的庫中,並按照tomcat文檔中的說明配置tomcat連接池。另一個優點是連接池設置的調整不需要重建戰爭。但是如果你的戰爭中有一個正確配置的連接池,那也沒關係。 –