【问题标题】:Class Not Found Exception for com.mysql.jdbc.Driver in Wildfly 10Wildfly 10 中 com.mysql.jdbc.Driver 的类未找到异常
【发布时间】:2016-06-09 19:44:34
【问题描述】:

我使用的是 Wildfly 10,我在standalone.xml 中的数据源是:

        <datasources>
            <datasource jta="true" jndi-name="java:/MySqlDS" pool-name="MySQL_AAA" enabled="true" use-ccm="true">
                <connection-url>jdbc:mysql://localhost:3306/aaa</connection-url>
                <driver-class>com.mysql.jdbc.Driver</driver-class>
                <driver>mysql-connector-java-5.1.35-bin.jar_com.mysql.jdbc.Driver_5_1</driver>
                <security>
                    <user-name>root</user-name>
                    <password>root</password>
                </security>
                <validation>
                    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
                    <background-validation>true</background-validation>
                    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
                </validation>
            </datasource>

我正在我的 Java bean 中运行此代码:

 Class.forName("com.mysql.jdbc.Driver");

我收到此错误消息:

10:29:59,210 ERROR [stderr] (default task-15) java.lang.ClassNotFoundException: com.mysql.jdbc.Driver from [Module "deployment.AAA_5.war:main" from Service Module Loader]


10:29:59,210 ERROR [stderr] (default task-15) at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)

我阅读了文档说我需要将驱动程序放在我的 lib 文件夹中,但这不起作用。我确定解决方案很简单,但我看不到。有人可以指出我正确的方向。一些我可以用作资源的文档会很棒。

【问题讨论】:

  • 你关注these docs了吗?
  • 这些文档适用于 Widfly 8。我正在使用 10。我在 Wildfly 中有一个正常运行的数据源。我正在使用它来填充应用程序的其余部分。它的定义显示在我的问题的第一部分。我需要知道如何正确访问驱动程序。
  • 我对 Wildfly 8、9 和 10 使用了相同的脚本 - 没有太多的变化。请参阅我的回答here 以获得更好的整体方法。您永远不应该直接获取驱动程序,而应该使用连接池。
  • Class.forName("com.mysql.jdbc.Driver"); 自 2007 年以来就不再需要了。

标签: java mysql jdbc wildfly


【解决方案1】:

将mysql驱动放到你wildfly的deployments文件夹中,它会自动部署,然后就可以使用了。
编辑: 由于类加载器的行为,在wildfly中安装mysql JDBC驱动程序不会让您访问mysql类,您只能通过jndi数据源访问数据库连接,您不需要使用Class.forName()

InitialContext context=new InitialContext();
DataSource d=(DataSource)context.lookup(yourDataSourceName);

但是,如果您仍然需要在项目中使用 mysql 特定的类,则必须将驱动程序放在您的 web-project/WEB-INF/lib 文件夹中。(但要小心,因为它与部署的驱动程序无关)

【讨论】:

  • 我已经在 Widlfly 的部署文件夹中有驱动程序。我还在standalone.xml 中配置了一个数据源。
  • 你在哪里调用(Class , method):Class.forName("com.mysql.jdbc.Driver");
  • 这似乎是我的问题的解决方案。我用过: InitialContext context = new InitialContext(); DataSource d = (DataSource) context.lookup("java:/MySqlDS");然后: JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, d.getConnection());
  • 重要说明,这种方式不会关闭连接,会导致连接池耗尽。关闭 finally 块中的连接。祝你好运
  • 我最终这样使用它: InitialContext context = new InitialContext(); DataSource datasource = (DataSource) context.lookup("java:/MySqlDS"); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, 参数, datasource.getConnection());感谢您的帮助。
猜你喜欢
  • 2023-04-07
  • 2013-04-06
  • 1970-01-01
  • 2011-10-05
  • 2017-06-09
  • 2012-04-19
  • 2017-08-18
  • 1970-01-01
相关资源
最近更新 更多