部署Spring Boot+Hibernate到Tomcat 8遇404及JDBC驱动错误求助
部署集成Hibernate的Spring Boot应用到Tomcat 8时的404及连接错误问题
在Dailyrazor购买的Tomcat 8服务器上部署集成Hibernate的Spring Boot应用,访问域名时返回404错误,查看Tomcat日志发现以下错误:
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19 at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:127) at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:59) at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:168) at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:92) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1990) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1940) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1915) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1876) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1145) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:767) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:302) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5074) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:919) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1704) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) ERROR next-step-co.com-startStop-2 org.apache.catalina.core.StandardContext - Error during ServletContainerInitializer processing javax.servlet.ServletException: Failed to instantiate WebApplicationInitializer class at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:158) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5164) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:919) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1704) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ExceptionInInitializerError at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:155) ... 12 more Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:175) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689) at com.arkan.registration.config.SessionFactoryCreator.createSessionFactory(SessionFactoryCreator.java:56) at com.arkan.registration.Run.<clinit>(Run.java:36) ... 17 more Caused by: org.hibernate.exception.JDBCConnectionException: Error calling DriverManager#getConnection at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:112) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:118) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionCreator.makeConnection(DriverManagerConnectionCreator.java:37) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:331) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:250) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:228) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:369) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:98) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:73) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 31 more Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/nextste2_next_step at java.sql.DriverManager.getConnection(DriverManager.java:689) at java.sql.DriverManager.getConnection(DriverManager.java:208) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionCreator.makeConnection(DriverManagerConnectionCreator.java:34)
我的配置文件
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" > <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="hibernate.connection.drive_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/nextste2_next_step</property> <property name="hibernate.connection.username">nextste2_abdullah</property> <property name="hibernate.connection.password">Unknowndude1</property> <!-- SQL Dialect --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property> <property name="hbm2ddl.auto">update</property> <property name="show_sql">true</property> <property name="hibernate.use_sql_comments">true</property> <property name="hibernate.format_sql">true </property> <!-- <property name="hibernate.cache.use_second_level_cache">true</property>--> <!-- <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>--> <!-- <property name="hibernate.cache.use_query_cache">true</property>--> </session-factory> </hibernate-configuration>
application.properties
# Database Details #spring.datasource.url = jdbc:mysql://localhost/next_step?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false #spring.datasource.username = abdullah #spring.datasource.password = app12341234 spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver spring.datasource.url = jdbc:mysql://localhost:3306/nextste2_next_step?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false spring.datasource.username = nextste2_abdullah spring.datasource.password = Unknowndude1 #spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver # Spring Security login queries security.basic.enabled = false spring.queries.users-query=SELECT username, password, '1' FROM auth_user WHERE username = ? and STATUS = 'VERIFIED' spring.queries.roles-query=SELECT auth_user.username AS username, auth_role.role_name AS role FROM auth_user INNER JOIN auth_user_role ON auth_user.auth_user_id = auth_user_role.userId INNER JOIN auth_role ON auth_user_role.roleId = auth_role.auth_role_id WHERE auth_user.username = ? spring.queries.users-business-query = SELECT username, password, '1' FROM auth_user_business WHERE username = ? and STATUS = 'VERIFIED' spring.queries.users-business-role-query = SELECT auth_user_business.username AS username, auth_role.role_name AS role FROM auth_user_business INNER JOIN business_user_role ON auth_user_business.auth_business_id = business_user_role.businessId INNER JOIN auth_role ON business_user_role.roleId = auth_role.auth_role_id WHERE auth_user_business.username = ?; # Setting the max file upload spring.servlet.multipart.max-file-size=100000MB spring.servlet.multipart.max-request-size=100000MB
问题排查与解决步骤
1. 修复Hibernate配置的拼写错误
hibernate.cfg.xml中数据库驱动属性名写错,导致Hibernate无法加载驱动:
原代码:
<property name="hibernate.connection.drive_class">com.mysql.jdbc.Driver</property>
修正为:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
(正确属性名是driver_class,原拼写少了一个r)
2. 统一MySQL驱动类与版本
你的application.properties使用的是MySQL 8+的驱动类com.mysql.cj.jdbc.Driver,但Hibernate配置中用的是旧版com.mysql.jdbc.Driver,需保持一致:
- 若服务器MySQL版本为8.0及以上,将Hibernate配置中的驱动类改为
com.mysql.cj.jdbc.Driver,同时确保项目依赖的mysql-connector-java版本为8.x; - 若服务器MySQL是5.x版本,统一使用
com.mysql.jdbc.Driver,对应依赖版本为5.x。
3. 确保MySQL驱动被打包进WAR包
检查项目依赖配置(如Maven的pom.xml),确保mysql-connector-java没有被标记为provided,否则Tomcat部署时不会包含该驱动:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- 移除<scope>provided</scope> --> <version>对应版本号</version> </dependency>
4. 解决Tomcat BCEL类格式错误
日志开头的ClassFormatException是因为Tomcat 8的BCEL组件不支持Java 8以上的字节码格式:
- 若使用Java 8,强制编译目标版本为1.8,在pom.xml中添加:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
- 若必须使用Java 9+,则需要升级Tomcat到9.0及以上版本,Tomcat 8对高版本Java字节码支持有限。
5. 验证数据库连接有效性
- 确认服务器本地MySQL服务正常运行,端口3306未被占用;
- 检查数据库
nextste2_next_step是否存在,用户名nextste2_abdullah拥有该库的读写权限; - 测试直接用JDBC连接字符串在服务器上连接数据库,确认账号密码无误。
内容的提问来源于stack exchange,提问作者Abdullah Howard
相关产品推荐
相关产品推荐

