尝试在外部在tomcat 9上运行带有rest控制器的spring boot war文件

Posted

技术标签:

【中文标题】尝试在外部在tomcat 9上运行带有rest控制器的spring boot war文件【英文标题】:Trying to run a springboot war file with rest controller on tomcat 9 externally 【发布时间】:2019-07-08 07:04:04 【问题描述】:

我一直在尝试部署 springboot 应用程序。我尝试了一个,可以成功地将带有rest控制器的springboot部署到嵌入式tomcat。现在我正在尝试另一种方法,我想将它打包为一个 Web 应用程序项目并部署到 tomcat。我能够部署它,但它不能正确解析休息控制器路径并给出 http 404 错误。我正在使用 gradle build 来执行此操作。

contextpath 属性不起作用。

我的应用程序在 http://localhost:8080/projectName/Welcome.jsp 启动。我需要在外部提供这个。它试图通过点击我在 jsp 中的链接移动到 http:localhost:8080/students。

这给出了错误 - 类型状态报告

寄语/学生

描述 源服务器没有找到目标资源的当前表示或不愿意透露存在。

我的 gradle 文件:

/*
 * This build file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java Library project to get you 
  started.
 * For more details take a look at the Java Libraries chapter in the 
 Gradle
 * user guide available at 
   https://docs.gradle.org/4.3/userguide/java_library_plugin.html
*/

 apply plugin: 'java'
 apply plugin: 'war'
 apply plugin: 'java-library'
 apply plugin: 'eclipse-wtp'
 apply plugin: 'org.springframework.boot'
 apply plugin: 'io.spring.dependency-management'

 repositories 
    mavenCentral()
  

  buildscript 
    repositories 
    jcenter()
    mavenCentral()
  

dependencies 
    classpath 'com.bmuschko:gradle-tomcat-plugin:2.5'
    classpath("org.springframework.boot:spring-boot-gradle- 
     plugin:2.0.5.RELEASE")

    //testImplementation 'junit:junit:4.12'

 

   apply plugin: 'com.bmuschko.tomcat'

    sourceCompatibility = 1.8
     targetCompatibility = 1.8

   bootWar
         mainClassName = 'org.sjsu.eds.student.main.StudentMain'
     



    dependencies 
      // This dependency is exported to consumers, that is to say found 
  on their compile classpath.
   api 'org.apache.commons:commons-math3:3.6.1'

   // This dependency is used internally, and not exposed to consumers 
      on their own compile classpath.
      implementation 'com.google.guava:guava:23.0'

   // Use JUnit test framework
    testImplementation 'junit:junit:4.12'



    def tomcatVersion = '9.0.8'
    tomcat "org.apache.tomcat.embed:tomcat-embed-core:$tomcatVersion",
       "org.apache.tomcat.embed:tomcat-embed-logging-juli:9.0.0.M6",
       "org.apache.tomcat.embed:tomcat-embed-jasper:$tomcatVersion" 
       /*reference - https://github.com/bmuschko/gradle-tomcat- 
      plugin/blob/master/README.md*/

 compile("org.springframework.boot:spring-boot-starter-web")
  testCompile('org.springframework.boot:spring-boot-starter-test')

compile ("org.apache.httpcomponents:httpclient:4.5.7")
compile ("org.springframework:spring-webmvc:4.1.6.RELEASE")


  tomcat 
  httpProtocol = 'org.apache.coyote.http11.Http11Nio2Protocol'
   ajpProtocol  = 'org.apache.coyote.ajp.AjpNio2Protocol'
  

我的spring主文件

 @SpringBootApplication
 public class StudentMain extends SpringBootServletInitializer

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder 
application) 
     return application.sources(StudentMain .class);


public static void main(String[] args) 
    // TODO Auto-generated method stub
    SpringApplication.run(StudentMain.class, args);



我的休息控制器很简单

@RestController
@RequestMapping(value="/students")
public class StudentController 

private StudentServiceImplWithoutDB studentService;

@Autowired
public StudentController(StudentServiceImplWithoutDB studentService) 
    this.studentService = studentService;



@GetMapping
public List<StudentVO> getAll()

    List<StudentVO> studentVO= studentService.getAllStudents();
    return studentVO;



我需要为战争设置任何路径或属性吗?几乎相同的应用程序在简单的 java 应用程序中嵌入 tomcat 就像一个魅力

【问题讨论】:

我认为您需要从 compile("org.springframework.boot:spring-boot-starter-web") exclude module: "spring-boot-starter-tomcat" 等依赖项中删除嵌入式 tomcat 它不起作用。它仍然存在上下文 404 问题 你必须这样做 在 Spring Boot 中禁用嵌入式 Tomcat 将包类型更改为 WAR 在主应用程序类中扩展 SpringBootServletInitializer 将 WAR 文件上传到 Tomcat webapps 目录 【参考方案1】:

首先你必须在gradle中提供tomcat作为provideRunTime,然后将包类型更改为war,然后在主类中扩展SpringBootServletInitializer,将war文件上传到tomcat web文件夹

按照这些步骤

先在gradle中添加

providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'

更改包类型

apply plugin: "war"

在主类中扩展 SpringBootServletInitializer 类

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 Application extends SpringBootServletInitializer 

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

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

建立战争

gradle war

【讨论】:

以上是关于尝试在外部在tomcat 9上运行带有rest控制器的spring boot war文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在外部 tomcat 中部署 Spring-boot REST API

Spring Boot 应用程序在本地主机上运行,​​但在外部 Tomcat 上返回 404

Tomcat 服务器无法“在外部”工作

Spring boot 1.4登录外部tomcat

在外部 Tomcat 服务器上运行的 Springboot 在除 index.html 之外的所有内容上都会出现错误 404

带有Angular应用程序的tomcat 9服务器上的Spring Boot 404和CORS