spring-boot - 由于工厂已定义而无法初始化组件

标签 spring-boot

创建的 spring boot 独立应用程序在 Spring Tool Suite 4 中运行时运行良好。当尝试从命令行运行 jar(使用导出 jar 构建)时观察到错误如下:

{
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:155) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:540) ~[jar:rsrc:spring-context-5.1.2.RELEASE.jar!/:na]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at games.hungama.songbeats.SongBeats1Application.main(SongBeats1Application.java:10) [rsrc:./:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_161]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_161]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161]
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61) [SongBeats.jar:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:125) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:414) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:174) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:179) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:152) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        ... 13 common frames omitted
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:960) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:370) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:106) ~[jar:rsrc:spring-boot-2.1.0.RELEASE.jar!/:na]
        ... 18 common frames omitted
Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: A child container failed during start
        at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:1.8.0_161]
        at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[na:1.8.0_161]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:951) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        ... 26 common frames omitted
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:960) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_161]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) ~[na:1.8.0_161]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        ... 26 common frames omitted
Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.StandardRoot@7dfdd352]
        at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:1.8.0_161]
        at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[na:1.8.0_161]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:951) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        ... 34 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.StandardRoot@7dfdd352]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:139) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:173) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4758) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4893) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_161]
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) ~[na:1.8.0_161]
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        ... 34 common frames omitted
Caused by: java.lang.Error: factory already defined
        at java.net.URL.setURLStreamHandlerFactory(URL.java:1112) ~[na:1.8.0_161]
        at org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.<init>(TomcatURLStreamHandlerFactory.java:130) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.getInstanceInternal(TomcatURLStreamHandlerFactory.java:53) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.register(TomcatURLStreamHandlerFactory.java:77) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.webresources.StandardRoot.registerURLStreamHandlerFactory(StandardRoot.java:699) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.webresources.StandardRoot.initInternal(StandardRoot.java:682) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) ~[jar:rsrc:tomcat-embed-core-9.0.12.jar!/:na]
        ... 44 common frames omitted

}

最佳答案

我遇到了同样的问题。经过大量研究后,在我看来最简单的解决方案是在 Jetty 而不是 Tomcat9 上运行您的应用程序。

显然,URLStreamHandlerFactory 只能设置一次,有时您的应用程序以外的其他东西会先发制人,例如在 Java 9 中。因此,当 tomcat 尝试为您的应用程序设置工厂时,它已经完成并且崩溃了.我在我的旧 Windows 7 计算机上没有这个问题,但我在我的 Windows 10 上有这个问题。

我找到了一些强制设置工厂等的建议,但似乎没有一个建议是最佳的。我通过在我的 pom.xml 文件中用 Jetty 替换 Tomcat 解决了这个问题:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>

除非您对 tomcat servlet 进行了自定义设置,否则您不需要更改任何其他内容,但当然您应该清理并重建您的项目以更新它。

关于spring-boot - 由于工厂已定义而无法初始化组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53517945/

相关文章:

java - Spring Boot 应用程序中存在 JNDI 的原因是什么?

java - Spring Boot Elasticsearch 配置

logging - Spring Boot - 设置使用 Java Util Logging (jul) 的外部 jar 的日志记录级别

spring-boot - 在 Spring Boot Test 中,如何将临时文件夹映射到配置属性?

java - 使用 RequestBody 的 POST 请求不起作用

java - 当值具有特殊符号(如 ':' )时,如何在 Spring Boot 中使用环境变量?

maven - 导入Maven依赖关系如何影响插件管理?

java - Spring RabbitMQ 将新队列附加到现有监听器

java - 没有名为 'mongoTemplate'的bean。 Spring Boot + MongoDB

spring-boot - 如何使用Binder反序列化为Kotlin数据类?