如何将简单的 Spring Boot(带有 Gradle 构建系统)部署到 Apache Tomcat(真实服务器,而不是嵌入服务器)?
Posted
技术标签:
【中文标题】如何将简单的 Spring Boot(带有 Gradle 构建系统)部署到 Apache Tomcat(真实服务器,而不是嵌入服务器)?【英文标题】:How to deploy a simple Spring Boot (with Gradle build system) to Apache Tomcat (real server, not embed server)? 【发布时间】:2016-06-12 16:39:40 【问题描述】:我遵循这个教程:http://spring.io/guides/gs/rest-service/
这是我的项目结构:
build.gradle
buildscript
repositories
mavenCentral()
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
jar
baseName = 'gs-rest-service'
version = '0.1.0'
repositories
mavenCentral()
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("junit:junit")
task wrapper(type: Wrapper)
gradleVersion = '2.3'
Application.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application
public static void main(String[] args)
SpringApplication.run(Application.class, args);
Greeting.java
package hello;
public class Greeting
private final long id;
private final String content;
public Greeting(long id, String content)
super();
this.id = id;
this.content = content;
public long getId()
return id;
public String getContent()
return content;
GreetingControler.java
package hello;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController
private static final String template = "Hello, %s";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name)
return new Greeting(counter.incrementAndGet(), String.format(template, name));
我知道如何通过 gradle bootRun
命令运行 Spring Boot 应用程序(在 Apache Tomcat 嵌入服务器上运行)。但我不知道如何在真正的 Apache Tomcat 上运行 Spring Boot 应用程序(此时请帮助我!)
【问题讨论】:
见official Spring Boot documentation。 我很努力,但无法创建用于在真实 Tomcat 服务器上部署或运行/调试的 war 文件。请帮我一个明确的答案。 尝试添加apply plugin: 'war'
,然后在控制台打印gradle war
。顺便说一句,在 Idea 中它是非常方便的 gradle 菜单,所以你甚至不需要在 cmd 中打印一些东西
@Enigo,我也把apply plugin: 'jar'
改成apply plugin: 'war'
,然后用命令gradle war
,但是没有成功。
@dovy,您可能还想看看使用Spring Initializr 生成带有WAR 打包的新Spring Boot 项目。确保使用项目页面底部的链接切换到完整版本。一旦您确认 WAR 与您的 Tomcat 安装一起工作,您就可以将您的自定义代码添加到项目中。
【参考方案1】:
关注comments's manish,我从http://start.spring.io/创建源码库
然后我导入 Eclipse for Java EE(带有 Spring Tools Suite、Gradle 插件),这是项目文件夹结构:
Greeting.java
package hello;
public class Greeting
private final long id;
private final String content;
public Greeting(long id, String content)
this.id = id;
this.content = content;
public long getId()
return id;
public String getContent()
return content;
GreetingController
package hello;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name)
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
我修改了文件GsRestServiceApplication.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GsRestServiceApplication
public static void main(String[] args)
SpringApplication.run(GreetingController.class, args); // <-- modify this line.
我不更改文件GsRestServiceApplication.java
package hello;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
return application.sources(GsRestServiceApplication.class);
我可以在真正的 Tomcat 服务器上运行 web 应用程序:
然后我使用浏览器或邮递员查看结果:
http://localhost:8080/gs-rest-service/greeting?name=Vy
【讨论】:
【参考方案2】:您正在使用 Gradle。尝试将其添加到您的 build.gradle 文件中。
dependencies
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
别忘了删除:
compile("org.springframework.boot:spring-boot-starter-web")
【讨论】:
如果删除compile("org.springframework.boot:spring-boot-starter-web")
,应用程序将无法运行
删除 spring-boot-starter-web
对我有帮助!以上是关于如何将简单的 Spring Boot(带有 Gradle 构建系统)部署到 Apache Tomcat(真实服务器,而不是嵌入服务器)?的主要内容,如果未能解决你的问题,请参考以下文章
将带有 Gradle 的单片 Spring Boot 应用程序转换为多模块失败
如何将带有 angular 2 前端(angular-cli build)的 spring-boot webapp 部署到 Tomcat?
Spring boot:JSON将带有时区的日期和时间反序列化为LocalDateTime
如何使用 Docker 配置带有 redis 的 Spring Boot Web 应用程序