我想演示一个简单的SpringBoot应用程序,该应用程序将部署到单独运行的Tomcat实例中。即使我的应用程序似乎已经部署完毕,我也无法在Tomcat中访问它。
我已经按照Spring documentation中的“传统部署”说明进行操作。
我曾尝试使用其他版本的Tomcat,并以ROOT.war
的形式运行war文件,但行为却相似。
当我独立进行战争时,例如java -jar build/libs/springbootify.war
我可以成功访问预期的URL http://localhost:8080/doit
。
Application.java
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
MyController.java
@RestController
public class MyController {
@GetMapping(value = "/doit")
public String getSomething() {
return "Something";
}
}
build.gradle
plugins {
id 'war'
id 'java'
id 'io.spring.dependency-management' version "1.0.8.RELEASE"
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'com.palantir.docker' version '0.22.1'
id 'com.palantir.docker-run' version '0.22.1'
}
repositories {
mavenCentral()
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
compile 'org.springframework.boot:spring-boot-devtools'
}
请参见Github上的可复制示例。
我可以看到war文件已经部署在Tomcat日志中
29-Jun-2019 17:07:04.434 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/springbootify.war] has finished in [857] ms
但是,当我访问http://localhost:8080/springbootify/doit
时,会收到404响应。
我希望它返回带有响应200的字符串“ something”。
更新-2019-07-12
我尝试使用Maven建立战争,并通过管理器UI手动部署到Tomcat,这可以正常工作
检查Gradle和Maven生成的战争文件之间的区别,我发现了以下内容:
1)Maven将这些附加属性添加到META-INF/MANIFEST.MF
:
Created-By: Maven Archiver 3.4.0
Build-Jdk-Spec: 12
Implementation-Title: springbootify
Implementation-Version: 0.0.1-SNAPSHOT
2)Maven向战争中添加了这个额外的库:
WEB-INF/lib/javax.annotation-api-1.3.2.jar
,而在Gradle战争中则是WEB-INF/lib-provided/javax.annotation-api-1.3.2.jar
我想这是它不能与Gradle一起使用的原因之一,但是到目前为止,我还没有设法修改Gradle产生的战争以包括这些差异。
新添加的pom.xml
也可以在提供的Github link上查看。