【发布时间】:2019-07-31 19:06:39
【问题描述】:
我在 docker 容器中运行一个简单的 spring-boot 应用程序。这是我的规格: - 春季启动 2.1.3.RELEASE - 带有 Windows 10 的 Java 11 - Docker 使用:FROM debian:stretch-slim 作为打包程序 - ENV JDK_VERSION="11.0.1"
Spring Boot 简单应用程序在上述配置下工作正常
当我添加 Mongodb (Spring data mongo) 并启动 spring boor 应用程序时,它在我的 windows 机器上运行良好,但是当我在 docker 容器中运行时,它抛出如下错误:
===============================================
o.s.b.web.embedded.tomcat.TomcatStarter:启动 Tomcat 上下文时出错。例外:org.springframework.beans.factory.BeanCreationException。消息:在类路径资源 [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class] 中创建名称为“servletEndpointRegistrar”的 bean 时出错:通过工厂方法实例化 bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]:工厂方法“servletEndpointRegistrar”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class] 中定义的名称为“healthEndpoint”的 bean 创建错误:通过方法表示的不满足的依赖关系“ healthEndpoint'参数1;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthIndicatorAutoConfiguration.class] 中定义名称为“healthIndicatorRegistry”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.health.HealthIndicatorRegistry]:工厂方法“healthIndicatorRegistry”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为 'org.springframework.boot.actuate.autoconfigure.mongo.MongoHealthIndicatorAutoConfiguration' 的 bean 时出错:通过构造函数参数 0 表示的不满足依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoTemplate”的 bean 创建错误:通过方法表示的不满足的依赖关系“ mongoTemplate'参数0;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoDbFactory”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.mongodb.core.MongoDbFactorySupport]:工厂方法 'mongoDbFactory' 抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class] 中定义名称为“mongo”的 bean 创建时出错:通过工厂方法进行 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 com.mongodb.MongoClientException:无法创建用于解析 SRV 记录的 JNDI 上下文。 'com.sun.jndi.dns.DnsContextFactory' 类在此 JRE 中不可用 2019-03-10 06:18:58.201 错误 1 --- [main] os.boot.SpringApplication:应用程序运行失败
org.springframework.context.ApplicationContextException:无法启动网络服务器;嵌套异常是 org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:157) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 com.eschoolo.EschooloCoreServiceApplication.main(EschooloCoreServiceApplication.java:24) ~[classes!/:0.0.1-SNAPSHOT] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na] 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na] 在 java.base/java.lang.reflect.Method.invoke(未知来源)~[na:na] 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[eschoolo.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[eschoolo.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) ~[eschoolo.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) ~[eschoolo.jar:0.0.1-SNAPSHOT] 引起:org.springframework.boot.web.server.WebServerException:无法启动嵌入式Tomcat 在 org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:125) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatWebServer.(TomcatWebServer.java:86) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:415) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:174) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:154) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] ...省略了16个常用框架 引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class]中定义名称为“servletEndpointRegistrar”的bean创建错误:bean实例化通过工厂方法失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]:工厂方法“servletEndpointRegistrar”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class] 中定义的名称为“healthEndpoint”的 bean 创建错误:通过方法表示的不满足的依赖关系“ healthEndpoint'参数1;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/actuate/autoconfigure/health/HealthIndicatorAutoConfiguration.class] 中定义名称为“healthIndicatorRegistry”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.boot.actuate.health.HealthIndicatorRegistry]:工厂方法“healthIndicatorRegistry”抛出异常;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为 'org.springframework.boot.actuate.autoconfigure.mongo.MongoHealthIndicatorAutoConfiguration' 的 bean 时出错:通过构造函数参数 0 表示的不满足依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoTemplate”的 bean 创建错误:通过方法表示的不满足的依赖关系“ mongoTemplate'参数0;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoDbFactory”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.mongodb.core.MongoDbFactorySupport]:工厂方法 'mongoDbFactory' 抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class] 中定义名称为“mongo”的 bean 创建时出错:通过工厂方法进行 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 com.mongodb.MongoClientException:无法创建用于解析 SRV 记录的 JNDI 上下文。 'com.sun.jndi.dns.DnsContextFactory' 类在此 JRE 中不可用 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:607) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1305) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1144) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:235) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:226) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:101) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.ServletContextInitializerBeans.(ServletContextInitializerBeans.java:88) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:261) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:234) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在 org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:54) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE] 在
原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoDbFactory”的 bean 创建错误:通过 bean 实例化工厂方法失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.mongodb.core.MongoDbFactorySupport]:工厂方法 'mongoDbFactory' 抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class] 中定义名称为“mongo”的 bean 创建时出错:通过工厂方法进行 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 com.mongodb.MongoClientException:无法创建用于解析 SRV 记录的 JNDI 上下文。 'com.sun.jndi.dns.DnsContextFactory' 类在此 JRE 中不可用 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:607) ~[spring-beans-5.1.5.RELEASE.jar!/:5.1.5.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1305) ~
================================================ =========
我怀疑 Spring Boot 是否完全支持 Java 11,或者我缺少一些需要添加到 Dockerfile 中的 Java 模块。
到目前为止,我的 dockerfile 中添加了以下 java 模块:
--添加模块\ java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument
任何建议都会有所帮助。
【问题讨论】:
-
不,这不是 Spring Boot 问题,而且——因为你说它适用于你的 Windows 10 环境,但不适用于 Docker 容器——我认为这也不是 MongoDB 问题。我的猜测是您的 Windows 机器上和 Docker 容器内有两个不同的 JRE。你能告诉我们是哪一个吗?
-
是的。窗口机器我使用的是 Oracle jdk 11。在 Docker 容器中我使用的是 Openjdk 11.0.1。
标签: mongodb spring-boot dockerfile java-11