我正在从事一个Java EE项目(以下配置),我面对似乎是常规的例外: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
。
我正在使用Eclipse,一个嵌入式的Tomcat 7和Maven,即使找到了测试驾驶员,也找不到Tomcat。
我搜索了一些答案1、2和3,但建议尚不清楚:建议将mysql-connector-java
更改为provided
,然后手动复制服务器中的依赖关系(不清楚)。
但是我不明白为什么我应该排除部署的依赖性(范围provided
)并手动添加,不是矛盾吗?
阅读了Maven文档后,我觉得运行环境需要依赖性,因此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();
}
}
tomcat 7 jndi文档给您答案:将它们放在tomcat/lib文件夹中。
Apache随附的JRE内存泄漏预防侦听器 Tomcat通过在Tomcat期间触发驾驶员扫描来解决此问题 启动。默认情况下启用了这一点。这意味着只有图书馆 听众可见,例如$ catalina_base/lib中的听众 扫描数据库驱动程序。如果您正在考虑禁用此 功能,请注意,扫描将由第一个网络触发 使用JDBC的应用程序,导致此Web时失败 应用程序已重新加载,并适用于其他依赖的Web应用程序 此功能。
因此,在其中具有数据库驱动程序的Web应用程序 Web-Inf/lib目录不能依靠服务提供商机制 并应明确注册驱动程序。