尝试在外部在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 服务器上运行的 Springboot 在除 index.html 之外的所有内容上都会出现错误 404