Spring boot 使用spring boot 2.0.1在tomcat中部署war时发生IllegalStateException

Spring boot 使用spring boot 2.0.1在tomcat中部署war时发生IllegalStateException,spring-boot,Spring Boot,我用gradle+Boot2.0.1打包了一个war,gradle脚本如下 plugins { id 'org.springframework.boot' version '2.0.1.RELEASE' id 'java' id 'war' } apply plugin: 'io.spring.dependency-management' dependencyManagement { imports { mavenBom org.springf

我用gradle+Boot2.0.1打包了一个war,gradle脚本如下

plugins {
    id 'org.springframework.boot' version '2.0.1.RELEASE'
    id 'java'
    id 'war'
}

apply plugin: 'io.spring.dependency-management'

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

repositories {
    mavenCentral()
}
bootWar{
    mainClassName = 'api.abroad.Application'
}

configurations {
    providedRuntime
}
dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
主要功能如下的应用程序类

@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}
我还编写了一个扩展SpringBootServletilizer的类来覆盖配置函数,尽管文档中不需要它

public class ServletInitializer extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

}
我在windows中安装了tomcat 8.5.29,并部署了war。出现如下异常

2018-04-09 14:40:19.978  INFO 11720 --- [ost-startStop-1] com.tbiedu.abroad.ServletInitializer     : Started ServletInitializer in 4.113 seconds (JVM running for 10.228)
2018-04-09 14:40:19.989  INFO 11720 --- [ost-startStop-1] c.t.abroad.controller.DemoController     : Root context already created (using as parent).
09-Apr-2018 14:40:19.992 严重 [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/abroad-service-api]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:986)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: No SpringApplication sources have been defined. Either override the configure method or add an @Configuration annotation
        at org.springframework.util.Assert.state(Assert.java:73)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:127)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87)
        at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5204)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 10 more

我遗漏了什么吗…

您需要将@Configuration置于该类之上

@Configuration//--> this line u need to place 
public class ServletInitializer extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
}
}

您需要将@Configuration置于此类之上

@Configuration//--> this line u need to place 
public class ServletInitializer extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
}
}

我不确定你指的是什么文件,但战争文件部分有。看起来您在重用start.spring.io在请求生成war项目时所做的工作。那个war项目对我来说很好,所以也许你可以在某个地方分享你的项目?谢谢你的重用,所以我重新检查了我的代码,在一个控制器类上找到了另一个extends SpringBootServletializer。在我删除了重复的一个之后,它工作得很好。我不确定你指的是什么文档,但是关于war文件的部分有。看起来您在重用start.spring.io在请求生成war项目时所做的工作。那个war项目对我来说很好,所以也许你可以在某个地方分享你的项目?谢谢你的重用,所以我重新检查了我的代码,在一个控制器类上找到了另一个extends SpringBootServletializer。在我移除重复的一个后,它工作正常。