android8.0 services.jar 运行时找不到第三方jar包问题

本文解决了一个在Android系统中,PhoneWindowManager调用第三方Jar包接口时,运行时报错找不到类的问题。通过在AndroidManifest.xml声明依赖或修改dex_preopt.mk文件,将第三方Jar包加入系统服务类路径,成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题
PhoneWindowManager.java里面调用了第三方jar的接口,编译通过,生成services.jar,push进去,运行时找不到jar包,而jar包明明在/vendor/framework/com.mstar.android.jar
错误log,如下,
Caused by: java.lang.ClassNotFoundException: Didn’t find class “com.mstar.android.tvapi.common.TvManager” on path: DexPathList[[zip file “/system/framework/services.jar”, zip file “/system/framework/ethernet-service.jar”, zip file “/system/framework/wifi-service.jar”, zip file “/system/framework/pppoe-service.jar”],nativeLibraryDirectories=[/system/lib64, /vendor/lib64, /system/lib64, /vendor/lib64]]

二、解决
1、如果是一般的apk,则在AndroidManifest.xml,声明<uses-library android:name="com.mstar.android" />即可
2、services.jar是系统服务,找不到AndroidManifest.xml
修改文件build/make/core/dex_preopt.mk,增加一行

PRODUCT_SYSTEM_SERVER_CLASSPATH := $(PRODUCT_SYSTEM_SERVER_CLASSPATH):/vendor/framework/com.mstar.android.jar

重新编译烧录即可

C:\Users\Administrator\.jdks\ms-17.0.15\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:C:\Users\Administrator\AppData\Local\Programs\IntelliJ IDEA Ultimate 2025.1.3\lib\idea_rt.jar=59648" -Dfile.encoding=UTF-8 -classpath C:\Users\Administrator\IdeaProjects\demo\target\classes;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-web\2.6.13\spring-boot-starter-web-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter\2.6.13\spring-boot-starter-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-logging\2.6.13\spring-boot-starter-logging-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\apache-maven-3.9.10\maven-repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\apache-maven-3.9.10\maven-repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\apache-maven-3.9.10\maven-repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-json\2.6.13\spring-boot-starter-json-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\core\jackson-databind\2.13.4.2\jackson-databind-2.13.4.2.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\core\jackson-annotations\2.13.4\jackson-annotations-2.13.4.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\core\jackson-core\2.13.4\jackson-core-2.13.4.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.4\jackson-datatype-jdk8-2.13.4.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.4\jackson-datatype-jsr310-2.13.4.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.4\jackson-module-parameter-names-2.13.4.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.13\spring-boot-starter-tomcat-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.68\tomcat-embed-core-9.0.68.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.68\tomcat-embed-el-9.0.68.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.68\tomcat-embed-websocket-9.0.68.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-web\5.3.23\spring-web-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-beans\5.3.23\spring-beans-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-webmvc\5.3.23\spring-webmvc-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-aop\5.3.23\spring-aop-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-context\5.3.23\spring-context-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-expression\5.3.23\spring-expression-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-core\5.3.23\spring-core-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-jcl\5.3.23\spring-jcl-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-configuration-processor\2.6.13\spring-boot-configuration-processor-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-devtools\2.6.13\spring-boot-devtools-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot\2.6.13\spring-boot-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-autoconfigure\2.6.13\spring-boot-autoconfigure-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.2.2\mybatis-spring-boot-starter-2.2.2.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-jdbc\2.6.13\spring-boot-starter-jdbc-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-jdbc\5.3.23\spring-jdbc-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.2.2\mybatis-spring-boot-autoconfigure-2.2.2.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\mybatis\3.5.9\mybatis-3.5.9.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\mybatis-spring\2.0.7\mybatis-spring-2.0.7.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-tx\5.3.23\spring-tx-5.3.23.jar;D:\apache-maven-3.9.10\maven-repository\com\mysql\mysql-connector-j\8.0.31\mysql-connector-j-8.0.31.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-actuator\2.6.13\spring-boot-starter-actuator-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.6.13\spring-boot-actuator-autoconfigure-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-actuator\2.6.13\spring-boot-actuator-2.6.13.jar;D:\apache-maven-3.9.10\maven-repository\io\micrometer\micrometer-core\1.8.11\micrometer-core-1.8.11.jar;D:\apache-maven-3.9.10\maven-repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;D:\apache-maven-3.9.10\maven-repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar com.example.demo.DemoApplication 13:42:30.278 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@28c78a11 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.6.13) 2025-07-11 13:42:30.555 INFO 6852 --- [ restartedMain] com.example.demo.DemoApplication : Starting DemoApplication using Java 17.0.15 on 闫晓强 with PID 6852 (C:\Users\Administrator\IdeaProjects\demo\target\classes started by Administrator in C:\Users\Administrator\IdeaProjects\demo) 2025-07-11 13:42:30.556 INFO 6852 --- [ restartedMain] com.example.demo.DemoApplication : No active profile set, falling back to 1 default profile: "default" 2025-07-11 13:42:30.590 INFO 6852 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable 2025-07-11 13:42:30.591 INFO 6852 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' 2025-07-11 13:42:31.184 WARN 6852 --- [ restartedMain] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.example.demo]' package. Please check your configuration. 2025-07-11 13:42:31.495 INFO 6852 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2025-07-11 13:42:31.502 INFO 6852 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-07-11 13:42:31.503 INFO 6852 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.68] 2025-07-11 13:42:31.555 INFO 6852 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-07-11 13:42:31.556 INFO 6852 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 965 ms 2025-07-11 13:42:31.785 INFO 6852 --- [ restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html] 2025-07-11 13:42:32.037 INFO 6852 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2025-07-11 13:42:32.040 INFO 6852 --- [ restartedMain] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator' 2025-07-11 13:42:32.072 INFO 6852 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2025-07-11 13:42:32.083 INFO 6852 --- [ restartedMain] com.example.demo.DemoApplication : Started DemoApplication in 1.796 seconds (JVM running for 2.257) 2025-07-11 13:42:32.425 INFO 6852 --- [)-192.168.0.102] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2025-07-11 13:42:32.425 INFO 6852 --- [)-192.168.0.102] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2025-07-11 13:42:32.426 INFO 6852 --- [)-192.168.0.102] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms 2025-07-11 13:42:32.472 INFO 6852 --- [)-192.168.0.102] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2025-07-11 13:42:33.605 ERROR 6852 --- [)-192.168.0.102] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar:na] at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:330) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.getProduct(DataSourceHealthIndicator.java:122) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.doDataSourceHealthCheck(DataSourceHealthIndicator.java:105) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.doHealthCheck(DataSourceHealthIndicator.java:100) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:82) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthIndicator.getHealth(HealthIndicator.java:37) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:94) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:41) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getLoggedHealth(HealthEndpointSupport.java:172) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:145) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getAggregateContribution(HealthEndpointSupport.java:156) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:141) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:110) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:81) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:88) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:78) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.3.23.jar:5.3.23] at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:74) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:122) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:97) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) ~[na:na] at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1405) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) ~[na:na] at java.base/jdk.internal.reflect.GeneratedMethodAccessor48.invoke(Unknown Source) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) ~[na:na] at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) ~[na:na] at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) ~[na:na] at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) ~[na:na] at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) ~[na:na] at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] 2025-07-11 13:42:33.608 WARN 6852 --- [)-192.168.0.102] o.s.b.a.jdbc.DataSourceHealthIndicator : DataSource health check failed org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:83) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:330) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.getProduct(DataSourceHealthIndicator.java:122) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.doDataSourceHealthCheck(DataSourceHealthIndicator.java:105) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.doHealthCheck(DataSourceHealthIndicator.java:100) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:82) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthIndicator.getHealth(HealthIndicator.java:37) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:94) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:41) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getLoggedHealth(HealthEndpointSupport.java:172) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:145) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getAggregateContribution(HealthEndpointSupport.java:156) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:141) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:110) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:81) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:88) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:78) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.3.23.jar:5.3.23] at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:74) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:122) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:97) ~[spring-boot-actuator-2.6.13.jar:2.6.13] at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) ~[na:na] at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1405) ~[na:na] at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) ~[na:na] at java.base/jdk.internal.reflect.GeneratedMethodAccessor48.invoke(Unknown Source) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) ~[na:na] at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) ~[na:na] at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) ~[na:na] at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) ~[na:na] at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) ~[na:na] at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) ~[na:na] at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar:na] at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) ~[spring-jdbc-5.3.23.jar:5.3.23] at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) ~[spring-jdbc-5.3.23.jar:5.3.23] ... 47 common frames omitted 请给出原因解释 数据库配置如下spring.datasource.url=jdbc:mysql://localhost:3306/mysqlservicedbone?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=mysql12345 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
最新发布
07-12
<think>我们正在解决Spring Boot启动连接MySQL数据库失败的问题,具体错误是'Access denied for user root@localhost using password YES' 这个错误通常意味着:用户名、密码或主机权限不正确。 根据引用[1]和引用[2]中的信息,我们可以从以下几个方面排查: 1. 检查MySQL中root用户的host是否为'%'(允许任意主机连接)或特定主机(如localhost、应用的IP等) 2. 检查Spring Boot配置文件中数据库连接参数(用户名、密码、数据库名、主机地址等)是否正确 3. 检查MySQL是否允许远程连接(如果应用和MySQL不在同一台机器上) 4. 检查MySQL的root用户密码是否正确 另外,引用[3]提到数据库名写错也会导致连接失败,但错误信息不同。当前错误是访问被拒绝,所以重点在用户权限和密码。 步骤: 一、检查Spring Boot配置文件(application.properties或application.yml)中的数据库连接配置: 确保以下属性正确: spring.datasource.url=jdbc:mysql://<host>:<port>/<database>?useSSL=false&serverTimezone=UTC spring.datasource.username=<username> spring.datasource.password=<password> 例如: spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 注意:如果MySQL运行在Docker容器中(如引用[2]),则主机地址可能是Docker容器的IP或映射的宿主机IP(如127.0.0.1)和端口(如33061)。 二、检查MySQL用户权限: 1. 登录MySQL(在MySQL服务器上执行): mysql -u root -p 2. 查看root用户的权限: SELECT user, host, authentication_string FROM mysql.user; 3. 如果root用户的host不是'%'(允许所有主机)或应用所在主机的IP,则需要修改: 例如,将root用户的host改为'%'(允许任意主机): UPDATE mysql.user SET host='%' WHERE user='root'; FLUSH PRIVILEGES; 注意:生产环境中不建议使用root和'%',建议创建特定用户并授权。 三、检查MySQL是否允许远程连接: 1. 确保MySQL配置文件(如my.cnf)中,bind-address不是127.0.0.1(只允许本地连接),可以注释掉或改为0.0.0.0(允许所有IP连接)。 在引用[2]的docker-compose配置中,通过volumes挂载了my.cnf,可以修改该文件。 2. 重启MySQL服务。 四、检查密码是否正确: 1. 在MySQL服务器上,尝试用配置的密码登录: mysql -u root -p 输入密码,看能否登录。 2. 如果忘记密码,可以重置root密码: a. 停止MySQL服务 b. 以安全模式启动MySQL(跳过权限表): mysqld_safe --skip-grant-tables & c. 登录MySQL,更新密码: UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE user='root'; FLUSH PRIVILEGES; d. 重启MySQL 五、检查防火墙: 如果MySQL和应用不在同一台机器,确保MySQL服务器的防火墙开放了MySQL端口(默认3306)。 六、在Spring Boot中,可以开启更详细的数据库连接日志,帮助调试: 在application.properties中添加: logging.level.org.springframework.jdbc=DEBUG logging.level.org.hibernate=DEBUG 示例配置(application.properties): spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 # 如果使用连接池,如Hikari,可以配置连接池属性 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 开启详细日志 logging.level.org.springframework.jdbc=DEBUG 七、如果使用Docker,确保MySQL容器已启动,并且端口映射正确(如引用[2]中映射3306到宿主机的33061,那么连接应使用宿主机的33061端口)。 八、如果应用和MySQL在同一台机器,可以尝试将连接地址改为127.0.0.1或localhost。 九、检查MySQL版本与驱动版本是否兼容: Spring Boot 2.x默认使用MySQL Connector/J 8.x,适用于MySQL 5.6及以上。 如果使用MySQL 5.5,可能需要降级驱动版本。 十、如果使用Spring Boot 2.x,确保数据库连接池依赖正确(如HikariCP),Spring Boot会自动引入。 总结步骤: 1. 检查配置(用户名、密码、数据库名、主机、端口) 2. 检查MySQL用户权限(host和权限) 3. 检查MySQL远程访问设置 4. 检查防火墙 5. 检查密码 6. 检查MySQL服务状态和端口监听 根据引用[3]的错误,我们也要注意数据库名是否正确,但当前错误是访问拒绝,所以先解决权限问题。 如果以上步骤都正确,问题应该解决。 下面我们将配置示例以properties格式写出(因为用户上一次是properties格式):</think>### 解决 Spring Boot 启动 MySQL 连接失败问题(Access denied for user root@localhost) #### 🔍 问题原因分析 错误 `Access denied for user root@localhost using password YES` 通常由以下原因引起: 1. **凭据错误**:用户名/密码不匹配(最常见原因)[^3] 2. **主机权限问题**:root用户未授权从指定主机访问 3. **密码加密方式不兼容**:MySQL 8.x使用`caching_sha2_password`,旧驱动可能不支持 4. **数据库未创建**:连接字符串中的数据库不存在[^3] --- ### ✅ 解决方案(分步实施) #### 1️⃣ 检查并修正数据库配置 在 `application.properties` 中确认以下配置: ```properties # 基础配置 spring.datasource.url=jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=你的密码 # MySQL 8.x 需要明确指定驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 连接池配置(可选但推荐) spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.maximum-pool-size=10 ``` > **关键点**: > - 检查数据库名是否正确(常见错误源)[^3] > - 确认端口号(默认3306,Docker环境可能不同)[^2] > - 添加 `?useSSL=false&serverTimezone=UTC` 避免连接问题 #### 2️⃣ 修正MySQL用户权限(核心步骤) 登录MySQL执行以下命令: ```sql -- 检查用户权限 SELECT user, host, plugin FROM mysql.user; -- 授权root用户从任意主机访问(开发环境) ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; -- 或仅允许localhost访问(更安全) ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; ``` > **注意**:MySQL 8.x 默认使用 `caching_sha2_password`,改为 `mysql_native_password` 可兼容旧驱动[^1] #### 3️⃣ Docker环境特殊配置 若使用Docker,在 `docker-compose.yml` 中添加: ```yaml services: mysql: environment: MYSQL_ROOT_PASSWORD: 你的密码 MYSQL_ROOT_HOST: '%' # 允许root从任意主机连接[^2] ports: - "3306:3306" command: --default-authentication-plugin=mysql_native_password ``` #### 4️⃣ 验证数据库连接 使用命令行测试连接: ```bash mysql -u root -p -h 127.0.0.1 # 输入密码后执行 SHOW DATABASES; ``` #### 5️⃣ 添加测试端点验证 创建测试控制器: ```java @RestController public class DBTestController { @Autowired private DataSource dataSource; @GetMapping("/test-db") public String testConnection() { try (Connection conn = dataSource.getConnection()) { return "数据库连接成功!"; } catch (SQLException e) { return "连接失败: " + e.getMessage(); } } } ``` 访问 `http://localhost:8080/test-db` 获取详细错误信息 --- ### 🔧 故障排除表 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 连接拒绝 | 密码错误 | 重置密码 `ALTER USER 'root'@'%' IDENTIFIED BY 'new_password'` | | 无法到数据库 | 数据库未创建 | 创建数据库 `CREATE DATABASE dbname` | | 公钥检索错误 | 密码插件不兼容 | 添加 `?allowPublicKeyRetrieval=true` 到连接字符串 | | 连接超 | 端口错误/防火墙 | 检查端口映射和防火墙设置[^2] | | SSL握手失败 | SSL配置问题 | 添加 `useSSL=false` 到连接字符串 | --- ### 📚 相关问题 1. 如何在生产环境中安全配置MySQL root用户权限? 2. Spring Boot如何集成MySQL 8.x的新身份验证插件? 3. Docker环境下MySQL数据持久化的最佳实践是什么?[^2] 4. 如何为不同环境(dev/test/prod)配置不同的数据库凭证? 5. 使用JPA出现`Table not found`错误应如何解决?[^3]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值