java.lang.ClassNotFoundException:com.mysql.jdbc.Driver(maven + jboss)
maven pom.xml
4.0.0 Test Test 0.0.1-SNAPSHOT war Test http://maven.apache.org UTF-8 org.apache.maven.plugins maven-compiler-plugin 1.6 1.6 junit junit 3.8.1 test javax.servlet servlet-api 2.5 mysql mysql-connector-java 5.1.18
在代码中我试图执行Class.forName("com.mysql.jdbc.Driver")
。
我明白了:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
但我已经检查过我在jboss-as-7.0.2.Final\standalone\deployments\Test.war\WEB-INF\lib
有mysql.jar,它有com.mysql.jdbc.Driver类。
通常,您不应该在war文件中包含JDBC驱动程序。
我建议您将驱动程序标记为已提供,并将其添加到服务器的lib目录中。
PS。 我不确定你为什么要使用它
Class.forName("com.mysql.jdbc.Driver")
在你的代码中。 为什么不让包含管理您的连接和交易?
发生此错误是因为您的mysql jar不在您的运行时类路径上。 如果你正在使用maven,
- 打开您的EAR / Web项目属性
- 点击“部署组装”
- 点击“添加…”
- 选择“Java Build Path Entries”
- 点击“下一步”
- 选择“Maven Dependencies”
- 点击“完成”
看来你正在使用JBoss AS7。 请查看以下说明: https : //community.jboss.org/wiki/DataSourceConfigurationInAS7
基本上,你应该
- 安装mysql连接器
- 使用它创建数据源
- 使用JNDI配置引用该数据源
Class.forName()是容器未提供数据源时常用的习惯用法。 在现代Java EE服务器中,提供了它们。
我的用例略有不同。 我在一个独立的应用程序中使用apache的BasicDataSource。
我得到了这个例外,因为我用com.mysql.jdbc.Driver.class.toString()
而不是"com.mysql.jdbc.Drive"
作为字符串调用setDriverClassName
(因此编译时检查确保没有拼写错误或Driver’s位置没有在版本升级中改变…等)。
但!
当您查看Driver的实现时,它有一个静态初始化块:
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
当我编写com.mysql.jdbc.Driver.class.toString()
这个初始化块执行得太早,导致稍后引发误导性的ClassNotFoundException
。 一旦我切换到"com.mysql.jdbc.Driver"
我的应用程序就开始工作了。
这是静态变得邪恶的情况 🙂