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文件夹

Spring Boot 嵌入式 Tomcat 性能

为 Spring Boot 嵌入式 tomcat 添加战争

使用 IntelliJ 部署启用嵌入式 tomcat 的 spring-boot 应用程序

如何在 spring-boot 中拦截嵌入式 Tomcat 上的“全局”404