GVKun编程网logo

Spring Boot嵌入式Tomcat依赖关系在启动时引发异常(springboot内嵌tomcat启动原理)

458

针对SpringBoot嵌入式Tomcat依赖关系在启动时引发异常和springboot内嵌tomcat启动原理这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展java–SpringBoot

针对Spring Boot嵌入式Tomcat依赖关系在启动时引发异常springboot内嵌tomcat启动原理这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确、Spring Boot-替换默认的嵌入式Tomcat连接器、Spring Boot启用/禁用带有配置文件的嵌入式Tomcat、Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB等相关知识,希望可以帮助到你。

本文目录一览:

Spring Boot嵌入式Tomcat依赖关系在启动时引发异常(springboot内嵌tomcat启动原理)

Spring Boot嵌入式Tomcat依赖关系在启动时引发异常(springboot内嵌tomcat启动原理)

我正在从JBoss /
Wildfly移植一个旧应用程序以在tomcat上运行。我可以使用网络上的资源完成的大多数工作。但是,我对最新一期不太满意。我很早就知道我必须补充

providedRuntime(''org.apache.tomcat.embed:tomcat-embed-jasper'')

作为请求路由的依赖项。如果不包括此依赖项,则发出请求时会出现404错误。现在,这似乎对我的应用程序没有任何不利影响,但是如果没有错误,我将不理解启动错误。

为此的目标环境是运行Tomcat 8的AWS,并且在部署时工作正常。我只看到此错误在本地运行(启用了调试):

2017-04-10 09:40:26.957 DEBUG 45630 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner  : Scanning JAR [file:/Users/bhodgson/.gradle/caches/modules-2/files-2.1/org.apache.velocity/velocity/1.6.2/1b470ec12a9b8aa69b0458a7e477dacb2cbdd6a0/velocity-1.6.2.jar] from classpath2017-04-10 09:40:26.958 DEBUG 45630 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner  : Scanning JAR [file:/Users/bhodgson/.gradle/caches/modules-2/files-2.1/net.minidev/accessors-smart/1.1/a527213f2fea112a04c9bdf0ec0264e34104cd08/accessors-smart-1.1.jar] from classpath2017-04-10 09:40:26.958 DEBUG 45630 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner  : Scanning JAR [file:/Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.googlecode.json-simple/json-simple/1.1.1/c9ad4a0850ab676c5c64461a05ca524cdfff59f1/json-simple-1.1.1.jar] from classpath2017-04-10 09:40:26.958 DEBUG 45630 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner  : Scanning JAR [file:/Users/bhodgson/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/2.1/87c0ea803b69252868d09308b4618f766f135a96/objenesis-2.1.jar] from classpath2017-04-10 09:40:26.959 DEBUG 45630 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner  : Scanning JAR [file:/Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-core/2.2.11/c3f87d654f8d5943cd08592f3f758856544d279a/jaxb-api.jar] from classpath2017-04-10 09:40:26.963  WARN 45630 --- [ost-startStop-1] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-core/2.2.11/c3f87d654f8d5943cd08592f3f758856544d279a/jaxb-api.jar] from classloader hierarchyjava.io.FileNotFoundException: /Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-core/2.2.11/c3f87d654f8d5943cd08592f3f758856544d279a/jaxb-api.jar (No such file or directory)    at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_121]    at java.util.zip.ZipFile.<init>(ZipFile.java:219) ~[na:1.8.0_121]    at java.util.zip.ZipFile.<init>(ZipFile.java:149) ~[na:1.8.0_121]    at java.util.jar.JarFile.<init>(JarFile.java:166) ~[na:1.8.0_121]    at java.util.jar.JarFile.<init>(JarFile.java:130) ~[na:1.8.0_121]    at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:60) ~[tomcat-embed-core-8.5.11.jar:8.5.11]    at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:48) ~[tomcat-embed-core-8.5.11.jar:8.5.11]    at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:338) ~[tomcat-embed-core-8.5.11.jar:8.5.11]    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:288) ~[tomcat-embed-core-8.5.11.jar:8.5.11]    at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) [tomcat-embed-jasper-8.5.11.jar:8.5.11]    at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) [tomcat-embed-jasper-8.5.11.jar:8.5.11]    at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101) [tomcat-embed-jasper-8.5.11.jar:8.5.11]    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178) [tomcat-embed-core-8.5.11.jar:8.5.11]    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11]    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) [tomcat-embed-core-8.5.11.jar:8.5.11]    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.5.11.jar:8.5.11]    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_121]    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]java.io.FileNotFoundException: /Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-impl/2.2.11/a49ce57aee680f9435f49ba6ef427d38c93247a6/jaxb-core.jar (No such file or directory)    at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_121]    at java.util.zip.ZipFile.<init>(ZipFile.java:219) ~[na:1.8.0_121]    at java.util.zip.ZipFile.<init>(ZipFile.java:149) ~[na:1.8.0_121]    at java.util.jar.JarFile.<init>(JarFile.java:166) ~[na:1.8.0_121]    at java.util.jar.JarFile.<init>(JarFile.java:130) ~[na:1.8.0_121]

问题是,依赖项解析失败,因为没有附加到扫描的JAR路径的版本。这是丢失文件的本地存储库:

bhodgson-mbp:a49ce57aee680f9435f49ba6ef427d38c93247a6 bhodgson$ pwd/Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-impl/2.2.11/a49ce57aee680f9435f49ba6ef427d38c93247a6bhodgson-mbp:a49ce57aee680f9435f49ba6ef427d38c93247a6 bhodgson$ ls -lttotal 2048-rw-r--r--  1 bhodgson  staff  1047863 Apr 10 08:44 jaxb-impl-2.2.11.jar

仅对于jaxb-impl和jaxb-core会发生这种情况

我曾尝试清理依赖冲突,但是除了一个较旧版本的jaxb-impl作为暂态依赖以外,没有找到其他东西。

那我该怎么办?我看到所有的依赖项都已从Gradle缓存中解析出来,但是不明白为什么所请求的依赖项没有解析为正确的版本。我会猜测,因为这通常包含在JRE /
JDK或Tomcat本身中。

这是我的gradle文件:

buildscript {    ext {        springBootVersion = ''1.5.2.RELEASE''    }    repositories {        mavenCentral()    }    dependencies {        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")    }}apply plugin: ''java''apply plugin: ''eclipse-wtp''apply plugin: ''org.springframework.boot''apply plugin: ''war''war {    archiveName = "ROOT.war"    destinationDir = new File("${rootDir}/runway/FS_ROOT/opt/tomcat/webapps/")}sourceCompatibility = 1.8repositories {    mavenCentral()}configurations {    providedRuntime}dependencies {    compile(''org.springframework.boot:spring-boot-starter-web'')    compile(''org.springframework.boot:spring-boot-starter-security'')    compile(''org.springframework:spring-oxm:4.3.5.RELEASE'')    compile(''org.springframework.webflow:spring-webflow:2.4.4.RELEASE'')    compile(''org.springframework.security:spring-security-taglibs'')    compile(''commons-lang:commons-lang:2.6'')    compile(''commons-io:commons-io:2.1'')    compile(''commons-logging:commons-logging:1.2'')    compile(''commons-digester:commons-digester:2.1'')    compile(''commons-beanutils:commons-beanutils:1.9.3'')    compile(''commons-fileupload:commons-fileupload:1.2.2'')    compile(''commons-codec:commons-codec:1.8'')    compile(''joda-time:joda-time:2.1'')    compile(''com.jcraft:jsch:0.1.42'')    compile(''org.codehaus.jackson:jackson-mapper-asl:1.9.5'')    compile(''com.sun.jersey:jersey-client:1.19.3'')    compile(''com.sun.jersey.contribs:jersey-spring:1.19.3'')    compile(''com.sun.jersey:jersey-json:1.19.3''){        exclude module: ''jaxb-impl''     }    compile(''javax.servlet:javax.servlet-api:3.1.0'')    compile(''javax.servlet.jsp:jsp-api:2.2'')    compile(''org.apache.cxf:cxf-rt-frontend-jaxws:3.1.6'')    compile(''org.apache.cxf:cxf-rt-transports-http:3.1.6'')    compile(''org.apache.tiles:tiles-core:3.0.7'')    compile(''org.apache.tiles:tiles-extras:3.0.7'')    compile(''org.apache.tiles:tiles-servlet:3.0.7'')    compile(''org.apache.tiles:tiles-jsp:3.0.7'')    compile(''org.apache.tiles:tiles-api:3.0.7'')    compile(''org.apache.tiles:tiles-template:3.0.7'')    compile(''com.github.dandelion:datatables-jsp:1.1.0'')    compile(''com.github.dandelion:datatables-compression-yui:0.9.3'')    compile(''com.github.dandelion:datatables-servlet2:0.9.3'')    compile(''com.sun.xml.bind:jaxb-core:2.2.11'')    compile(''com.sun.xml.bind:jaxb-impl:2.2.11'')    testCompile(''org.testng:testng:6.3.1'')    testCompile(''org.easymock:easymock:3.1'')    testCompile(''org.springframework.boot:spring-boot-starter-test'')    providedRuntime(''javax.servlet:jstl'')    providedRuntime(''org.apache.tomcat.embed:tomcat-embed-jasper'')    providedRuntime(''org.springframework.boot:spring-boot-starter-tomcat'')}

答案1

小编典典

我遇到了同样的问题,并做了一些研究。

问题是tomcat TldScanner在jar中搜索tld文件。它使用StandardJarScanner并根据Tomcat Issue
59226递归搜索在jar清单中在Class-
Path头下定义的jar

为了构造清单中找到的依赖项的路径,它将依赖项名称附加到源jar路径。它适用于同一目录中的jar,例如爆炸war中的lib目录或tomcat
lib目录中的jar,但在从.m2或.gradle缓存构造的类路径的情况下会失败:

/Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-core/2.2.11/c3f87d654f8d5943cd08592f3f758856544d279a/jaxb-core.jar

jaxb-api.jar清单连接,结果路径无效

/Users/bhodgson/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-core/2.2.11/c3f87d654f8d5943cd08592f3f758856544d279a/jaxb-api.jar

例如,当您从IDE启动应用程序时,可能会发生这种情况。

java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确

java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确

更新 – >添加Security.addProvider(new BouncyCastleProvider());解决了这个问题

将ActiveMQ broker添加到我的配置中会导致以下错误.如果我删除了JMS配置,则此错误消失.

java.security.UnrecoverableKeyException: Failed to decrypt safe contents entry:
    javax.crypto.BadPaddingException: pad block corrupted

Spring Boot 2.1.1.RELEASE
嵌入式Tomcat与SSL
ActiveMQ的
@EnableJMS

更新:我从应用程序中删除了我的JMSConfiguration.class,一切都开始工作了. @EnableJMS必须做一些覆盖某事的事情.我将系统地评论该配置类中的bean,直到找到确切的罪魁祸首.我从未想过我的JMS Active MQ配置会与我的嵌入式Tomcat服务器的SSL配置发生冲突.

我已将其缩小到以下与原因相关的JMS相关bean.如果我完全摆脱了JMS配置,那么我不会得到密码错误.看起来这些东西是无关的,但它们是某种程度的.

@Bean
public brokerService broker() throws Exception {
    final brokerService broker = new brokerService();

使用下面的配置,我在启动Spring Boot时出错.如果我删除所有的@Configuration类并启动Spring Boot,这个配置工作正常.我已经尝试过PKCS,JKS和我尝试过的文件:我已经移动了文件,没有任何乐趣.我知道密码是正确的,因为它会正常启动,如果我删除我的配置类,我可以使用443 / ssl命中服务器…

server.contextpath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store:classpath:local-keystore.jks
server.ssl.key-store-password:password
server.ssl.keyStoreType:JKS
server.ssl.keyAlias:tomcat

遇到错误

org.apache.catalina.LifecycleException: Protocol handler start Failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1001)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPrevIoUslyRemovedConnectors(TomcatWebServer.java:259)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:311)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:164)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
    at com.jjkane.Application.main(Application.java:65)
Caused by: java.lang.IllegalArgumentException: keystore password was incorrect
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:224)
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1067)
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1149)
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:561)
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:998)
    ... 14 common frames omitted
Caused by: java.io.IOException: keystore password was incorrect
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2108)
    at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:243)
    at java.base/java.security.KeyStore.load(KeyStore.java:1479)
    at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:179)
    at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:204)
    at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:203)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112)
    ... 20 common frames omitted
 java.security.UnrecoverableKeyException: Failed to decrypt safe contents entry:
        javax.crypto.BadPaddingException: pad block corrupted

更新:此修改后出现相同的错误…

server.contextpath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store=classpath:local-keystore.p12
server.ssl.key-store-password=tomcat
server.ssl.key-password=tomcat
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat

解决方法

您可能正在使用JDK 8u161之前的Java版本,在这种情况下,可以通过将Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files添加到Java的安装来解决此异常.当使用更长的密钥大小完成加密/解密时,通常会出现问题.充气城堡也是这个问题的解决方案.
有关JCE文件的更多详细信息,请参阅oracle站点 https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

另一种解决方案是将您的java升级到上述或更高版本.

Spring Boot-替换默认的嵌入式Tomcat连接器

Spring Boot-替换默认的嵌入式Tomcat连接器

我需要将AJP连接器添加到嵌入式Tomcat并 禁用(或替换) 侦听8080 的默认连接器

我尝试使用EmbeddedServletContainerCustomizer对此进行自定义,但是我无法获得Tomcat对象的句柄来替换在那里创建的默认连接器。结果,除了AJP端口之外,我最终还使用了8080上的http端口。

接下来,我尝试扩展TomcatEmbeddedServletContainerFactory并覆盖其getTomcatEmbeddedServletContainer方法。对于JavaDoc,这似乎是替换默认连接器的理想之地,但最终仍被启用(也不会创建我的AJP连接器)。有什么想法可能会丢失吗?我已经通过调试器验证了我的配置正在运行。

根据下面的答案,这是最干净的解决方案:

@Bean
public EmbeddedServletContainerFactory tomcat() {
    TomcatEmbeddedServletContainerFactory myFactory = new TomcatEmbeddedServletContainerFactory();
    myFactory.setProtocol("AJP/1.3");
    myFactory.setPort(9000);
    return myFactory;
}

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer2() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                    connector.setRedirectPort(9001);
                }
            });
        }
    };
}

Spring Boot启用/禁用带有配置文件的嵌入式Tomcat

Spring Boot启用/禁用带有配置文件的嵌入式Tomcat

如何解决Spring Boot启用/禁用带有配置文件的嵌入式Tomcat?

使用

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
                                  WebMvcAutoConfiguration.class})

排除Spring Boot对嵌入式Servlet容器的自动配置。此外,你需要为非REST案例设置以下属性,以使Spring Boot不会尝试启动REST WebApplicationContext(需要一个servlet容器):

spring.main.web-environment=false

然后通过导入在REST配置文件中启用嵌入式Tomcat EmbeddedServletContainerAutoConfiguration.class(这将自动配置延迟到REST配置文件加载后:

@Profile({"REST"})
@Configuration
@Import(EmbeddedServletContainerAutoConfiguration.class)
public class HttpConfiguration {
    // ...
}

如果使用任何EmbeddedServletContainerCustomizer,还需要导入EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class

解决方法

我正在编写一个Spring Boot应用程序,该应用程序使用几个@Configuration类之一,具体取决于文件中@Profile设置的类application.properties

这些配置类之一使用REST接口,因此,我将其包括spring-boot-starter-web为依赖项。

这将启动嵌入式Tomcat实例,这很好。

问题是,其他配置文件不需要嵌入式服务器(例如,我使用JMS来处理传入消息而不是REST)。

有没有什么方法可以阻止@SpringBootApplicationTomcat在默认情况下启动,而仅将其用于REST Configuration类?例如,通过用@EnableWebMVC

这是我的@Configuration课程的一个示例:

REST:

@Profile({"REST"})
@Configuration
@EnableWebMvc
public class HttpConfiguration{
 .
 .
 .
}

JMS:

@Profile({"JMS"})
@Configuration
@EnableJms
public class JMSConfiguration{
 .
 .
 .
}

谢谢

Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB

Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB

我正在使用Spring boot嵌入式tomcat发布休息服务。

Spring Boot版本使用最新的“ 1.3.6.RELEASE”

我要求将application / json发布请求的大小限制为10KB。

厌倦了此解决方案,但不起作用, 在Spring Boot中增加HTTP PostmaxPostSize

请帮忙。

谢谢

关于Spring Boot嵌入式Tomcat依赖关系在启动时引发异常springboot内嵌tomcat启动原理的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确、Spring Boot-替换默认的嵌入式Tomcat连接器、Spring Boot启用/禁用带有配置文件的嵌入式Tomcat、Spring Boot嵌入式Tomcat“ application / json”发布请求限制为10KB的相关知识,请在本站寻找。

本文标签: