【问题标题】:Java EE ClassNotFoundException for MysqlDataSource. What am I doing wrong?MysqlDataSource 的 Java EE ClassNotFoundException。我究竟做错了什么?
【发布时间】:2016-06-11 20:24:41
【问题描述】:

我想连接到我的 MySQL 数据库,并查询一些数据。我收到以下错误:

2016-02-28 10:42:17,438] Artifact JavaEESecurity:war exploded: Error during artifact deployment. See server log for details. [2016-02-28 10:42:17,438] Artifact JavaEESecurity:war exploded: java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"JavaEESecurity_war_exploded.war\".INSTALL"
=> "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"JavaEESecurity_war_exploded.war\".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of deployment \"JavaEESecurity_war_exploded.war\"
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: 
    java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource from 
    [Module \"deployment.JavaEESecurity_war_exploded.war:main\" from Service Module Loader]
    Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource from [Module \"deployment.JavaEESecurity_war_exploded.war:main\" from Service Module Loader]"}}

我在我的项目中使用 maven。这是我的 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>my.own.group</groupId>
    <artifactId>myOwnArtifactId</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.2.13</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

这是我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <data-source>
        <name>java:global/JavaEESecurity/myDS</name>
        <class-name>com.mysql.jdbc.jdbc2.optional.MysqlDataSource</class-name>
        <server-name>localhost</server-name>
        <database-name>mncpp</database-name>
        <user>root</user>
        <transactional>true</transactional>
        <initial-pool-size>2</initial-pool-size>
        <max-pool-size>10</max-pool-size>
        <min-pool-size>5</min-pool-size>
        <max-statements>0</max-statements>
    </data-source>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
</web-app>

这是我的 bean 类,我想在其中访问我的数据库:

@Named("questionListBean")
@RequestScoped
public class QuestionListBean {
    List<String> questions;
    @Resource(lookup = "java:global/JavaEESecurity/myDS")
    DataSource ds;

    public List<String> getQuestions() {
        try (Connection connection = ds.getConnection()) {
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery("SELECT question FROM questions");
            questions = new ArrayList<>();

            while(rs.next()) {
                questions.add(rs.getString(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return questions;
    }
}

提前致谢!

【问题讨论】:

  • 您是否将您的MySQL 驱动程序jar 放入您的WEB-INF/lib 文件夹中?还是在您的应用服务器中?
  • 我猜 maven 应该解决这个问题
  • 不,它没有。你猜错了。如果你不把它放在那里,Maven 怎么能做到呢?尝试将 mysql-connector-java jar 放入 JBoss 安装的默认服务器配置(假设是您正在运行的服务器配置)中的 lib 目录中。
  • 我把它放到了爆炸战争的WEB-INF文件夹中可以找到的lib目录中,现在它被识别了,但是我的代码由于某种原因仍然不能工作,但它被编译了并且正在运行。

标签: java mysql maven jakarta-ee datasource


【解决方案1】:

ClassNotFoundException 表示运行应用程序服务器(Java EE 服务器)的 Java 运行时(JVM)不知何故无法找到类 com.mysql.jdbc.jdbc2.optional.MysqlDataSource。这个类是MySQL JDBC Driver 的一部分。由于在调用 bean 的方法 getQuestions() 时此类不可用,因此会引发异常。

有多种方法可以解决此问题:

  1. 让您的应用程序自包含。这意味着你捆绑 您的应用程序需要的所有类。这是 Java .ear(企业应用程序存档)的全部内容。 这样做(理论上)意味着您的应用程序可以移植 相当容易。为此,您可以以这种方式组装您的应用程序 您在 MySQL 连接器上指定 runtime 依赖项(请参阅 mvnrepository 对于 sn-p 并在 a 中添加 &lt;scope&gt;runtime&lt;/scope&gt;) &lt;dependency&gt; pom.xml 中的元素。然后您可以使用Maven ear plugin if you are assembling a .earMaven war plugin if you are assembling a .war 将所有内容捆绑在一起。
  2. 使 MySQL 驱动程序 jar 成为应用服务器类路径的一部分。这样,其他应用程序可以利用这些类(例如,您可能有多个使用 MySQL 的应用程序)。应用程序服务器具有此功能,因此这些类可供应用程序使用。请阅读您的应用服务器的文档以了解如何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多