使用 Spring-Boot 启动 Tomcat 上下文时出错:java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicD

Posted

技术标签:

【中文标题】使用 Spring-Boot 启动 Tomcat 上下文时出错:java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSource【英文标题】:Error starting Tomcat context with Spring-Boot: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSource 【发布时间】:2014-12-20 07:01:11 【问题描述】:

我最近决定将 spring-boot 添加到使用 java 代码配置的 hibernate 的现有 spring 项目中。我有这个 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>com.spring</groupId>
    <artifactId>app</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.8.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            </dependency>
        <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-core</artifactId>
           <version>4.3.6.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            </dependency>
    </dependencies>

    <properties>
        <start-class>com.spring.app.Application</start-class>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

当我尝试运行应用程序时(在命令: mvn compile / mvn package / java -jar 之后),我收到此错误:

Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSource
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at org.springframework.boot.loader.LaunchedURLClassLoader.doLoadClass(LaunchedURLClassLoader.java:168)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 136 common frames omitted

谁能告诉我这里缺少什么?

【问题讨论】:

你能发布你的配置吗?我怀疑您正在配置自己的数据源,Spring Boot 只需向 application.properties 文件添加几个属性即可为您做一些事情。 【参考方案1】:

您缺少数据源依赖项。您可以通过添加 DBCP 依赖项来解决它,也可以将 spring-txspring-ormhibernate-core 依赖项替换为 spring-boot-starter-data-jpa,并且您应该在 Spring Boot 项目中拥有所需的所有持久性依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

【讨论】:

好的,我用这个 spring-boot-starter-data-jpa 替换了我的 spring-tx、spring-orm 和 hibernate-core 条目,但没有解决问题。在我之前的项目中,要使用这个 BasicDataSource 类,我需要将 apache tomcat 添加到我的构建路径中。似乎spring-boot中的embed tomcat容器没有这个类? 较新的 tomcat 版本将 tomcat-jdbc 作为其数据源实现,而不再是 commons-dbcp。从堆栈跟踪来看,您已经自己明确配置了数据源,而不是让 Spring Boot 为您配置一个。它会建议后者并删除 commons-dbcp 依赖项,这将让您使用比 commons-dbcp 更快的 tomcat-jdbc 数据源。【参考方案2】:

根据此处发布的两个答案(一个已删除),我将这两个依赖项添加到我的 pom.xml:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
    </dependency>

并删除这三个:

   <dependency>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-core</artifactId>
       <version>4.3.6.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        </dependency>

这样就解决了问题。

【讨论】:

以上是关于使用 Spring-Boot 启动 Tomcat 上下文时出错:java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicD的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat需要很长时间才能识别spring-boot应用程序的启动

使用spring-boot开发,然后打包成jar,linux服务器,启动成功,端口号8081,但是访问报404错误

如何解决tomcat的问题? Spring-Boot“扫描失败”

spring-boot 项目启动过慢问题

spring-boot 需要启动nginx吗

spring-boot 需要启动nginx吗