spring boot 嵌入式 tomcat 不以 jcifs smb 库开头
Posted
技术标签:
【中文标题】spring boot 嵌入式 tomcat 不以 jcifs smb 库开头【英文标题】:spring boot embedded tomcat doesn't start with jcifs smb library 【发布时间】:2018-03-21 08:23:46 【问题描述】:我有一个独立的 java 应用程序,它使用 jcifs 库来执行 SMB 操作。独立应用程序使用 spring boot。此应用程序运行良好,能够满足要求。
我必须将这个独立的应用程序转换为一个安静的服务。因此,我使用了带有嵌入式 tomcat 的 spring boot 启动器。转换后的应用程序编译得很好,但是当我启动应用程序时,嵌入式 tomcat 没有启动并给出以下错误。 我已将问题缩小到包含 jcifs 库。当我删除它时,嵌入式 tomcat 启动正常,当我包含它时,会出现以下错误。 jcifs依赖如下: 编译组:'jcifs',名称:'jcifs',版本:'1.3.17'
请让我知道可能是什么问题或任何指示。我的时间表非常紧迫,因此非常感谢任何帮助/指针。
错误是: 2017-10-09 22:50:50.189 INFO 1780 --- [main] org.apache.catalina.core.StandardEngine:启动 Servlet 引擎:Apache Tomcat/8.5.5 2017-10-09 22:50:50.470 错误 1780 --- [cat-startStop-1] org.apache.catalina.core.ContainerBase:子容器在启动过程中失败
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]] 在 java.util.concurrent.FutureTask.report(FutureTask.java:122) [na:1.8.0_144] 在 java.util.concurrent.FutureTask.get(FutureTask.java:192) [na:1.8.0_144] 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:911) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:890) [tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) [tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) [tomcat-embed-core-8.5.5.jar:8.5.5] 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_144] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_144] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_144] 原因:org.apache.catalina.LifecycleException:无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.5.jar:8.5.5] ...省略了6个常用框架 原因:org.apache.catalina.LifecycleException:无法启动组件 [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.5.jar:8.5.5] ...省略了6个常用框架 原因:org.apache.catalina.LifecycleException:无法启动组件 [org.apache.catalina.authenticator.NonLoginAuthenticator[]] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:170) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.5.jar:8.5.5] ...省略了8个常用框架 引起:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; 在 org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1122) ~[tomcat-embed-core-8.5.5.jar:8.5.5] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.5.jar:8.5.5] ...省略了10个常见的框架
下面是 gradle 文件。我使用的是 gradle 2.10.0 版本。
buildscript
repositories
mavenCentral()
maven url "http://repo1.maven.org/maven2"
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.1.RELEASE")
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.2.1"
// Apply the java plugin to add support for Java
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'
apply plugin: "org.sonarqube"
apply plugin: 'jacoco'
jar
baseName = 'connectorservice'
version = '0.1.0'
manifest
attributes 'Main-Class': 'com.uu.ff.connectorservice.main.Application'
repositories
mavenCentral()
maven url "http://repo1.maven.org/maven2"
sourceCompatibility = 1.8
targetCompatibility = 1.8
// In this section you declare the dependencies for your production and test code
dependencies
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-aop')
compile('org.springframework:spring-aspects')
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
compile group: 'commons-io', name: 'commons-io', version: '2.5'
compile group: 'org.apache.commons', name: 'commons-vfs2', version: '2.1'
compile group: 'de.odysseus.staxon', name: 'staxon', version: '1.3'
testCompile("junit:junit")
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.6.4'
testCompile group: 'org.powermock', name: 'powermock-api-mockito', version: '1.6.4'
compile('org.springframework.boot:spring-boot-starter-test')
compile group: 'commons-dbcp', name: 'commons-dbcp', version: '1.4'
compile group: 'jcifs', name: 'jcifs', version: '1.3.17'
【问题讨论】:
Ueslei Lima 提供的解决方案完全符合我的要求。非常感谢。我无法将以下回复标记为答案。 【参考方案1】:您只需从 jcifs 库中排除“servlet-api”依赖项,它与 tomcat 默认的 servlet api 冲突。 在 Maven 中,它会是这样的:
<dependency>
<groupId>org.codelibs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.18.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
在使用 spring-integration-smb 库时,排除也很有效。
【讨论】:
以上是关于spring boot 嵌入式 tomcat 不以 jcifs smb 库开头的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式 Tomcat 中带有 JSP 标签库的 Spring-Boot
Spring Boot嵌入式Tomcat能否访问定义的spring.tomcat.basedir的webapps文件夹