Tomcat上的Spring Boot WAR文件部署显示错误404

时间:2018-09-24 11:34:02

标签: java spring-boot tomcat gradle

我尝试在独立的Tomcat 7.0.91上部署Gradle + Spring Boot 2 + Angular2应用程序WAR文件。 如果我使用提供的jar和嵌入式tomcat引导应用程序,一切正常,但是当我在“ / springboot”上下文中在独立容器上进行部署时,它会显示404:“原始服务器找不到目标资源的当前表示形式,或者不愿意透露一个人的存在。”来自tomcat的日志并不能说明任何有用的信息。 我通过设置server.xml上下文路径和doc base尝试了两种部署方法:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="/springboot" docBase="/home/user/SideProjects/springboot-angular2-gradle-war/build/libs"/>                                                     
</Host>

第二个是“手动”在webapps目录中部署战争文件。

我不确定,但是tomcat中的context.xml文件被设置为监视WEB-INF / web.xml中的资源,但是据我所知,spring boot不再使用web.xml了,也许是这样吗?不幸的是,我发现的每个教程都没有告诉我有关更改context.xml的任何信息,此外,我现在找不到在春季将什么资源视为部署描述符。

那是我的build.gradle文件:

 buildscript {
    ext {
        springBootVersion = '2.0.5.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'war'

apply plugin: 'application'
mainClassName = "com.demo.SpringbootAngular2GradleWarApplication"

group = 'com.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

war {
    baseName = "demo-spring"
}

repositories {
    mavenCentral()
}

configurations {
    providedRuntime
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}


def frontendDir = "$projectDir/src/main/frontend"
def frontDistDir = "$frontendDir/dist"

sourceSets {
    main {
        resources {
            srcDirs = ["$frontDistDir", "$projectDir/src/main/resources"]
        }
    }
}

clean.doFirst {
    delete "$frontDistDir"
    println "$frontDistDir - cleaned"
}

task buildAngular(type: Exec) {
    workingDir "$frontendDir"
    inputs.dir "$frontendDir"
    commandLine "npm", "run-script", "build"
}

processResources.dependsOn "buildAngular"

主类扩展了servlet初始化程序:

 package com.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class SpringbootAngular2GradleWarApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(SpringbootAngular2GradleWarApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringbootAngular2GradleWarApplication.class, args);
    }
}

1 个答案:

答案 0 :(得分:0)

问题是版本不兼容,为了支持el-api等,SpringBoot-2支持的最低Tomcat版本是8.5.x。实际上是在Web应用程序中消除战争并“手动”将其重命名。