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,

  1. 打开您的EAR / Web项目属性
  2. 点击“部署组装”
  3. 点击“添加…”
  4. 选择“Java Build Path Entries”
  5. 点击“下一步”
  6. 选择“Maven Dependencies”
  7. 点击“完成”

看来你正在使用JBoss AS7。 请查看以下说明: https : //community.jboss.org/wiki/DataSourceConfigurationInAS7

基本上,你应该

  1. 安装mysql连接器
  2. 使用它创建数据源
  3. 使用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"我的应用程序就开始工作了。

这是静态变得邪恶的情况 🙂