使用 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-tx
、spring-orm
和 hibernate-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错误