如何将简单的 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 应用程序

如何在带有嵌入式 tomcat 的 Spring Boot App 中设置域名

带有 pom.xml 和 app.java 的简单 spring-boot 应用程序显示构建失败错误