Spring Boot - Tomcat容器部署

SpringBoot - Hello World中我們簡單的結識了SpringBoot

注意到我們是直接執行main函數就把項目啟動起來了,并且部署到了tomcat容器。但是我們從頭到尾都沒有配置過任何的容器,更何況是tomcat。而且,我們一般的線上啟動web項目,可不是直接運行main函數的。

一般情況,都是把項目打包成war包,然后丟到tomcat,再啟動tomcat,現在SpringBoot這樣玩,那怎么上線?

這些就是接下來要討論的。

環境工具

  • IDEA
  • Maven3
  • JDK1.8
  • Tomcat8

當前Spring Boot 最新穩定版本為1.5.8

創建項目

打開IDEA -> new Project -> Spring Initializr -> 填寫Group,Article -> 選擇Web,勾選Web -> Next -> Finish

也可以基于Helloworld那個項目

設置banner

我們發現在SpringBoot啟動的時候會展示一個圖案

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.8.RELEASE)

修改banner

我們可以將其更換為我們自己想要的圖案:

  • src/main/resources下面新建一個banner.txt文件
  • 將我們想更換的圖案放入其中,比如我更換為下圖:
.______        ______        ___       ______  __    __  
|   _  \      /  __  \      /   \     /      ||  |  |  | 
|  |_)  |    |  |  |  |    /  ^  \   |  ,----'|  |__|  | 
|      /     |  |  |  |   /  /_\  \  |  |     |   __   | 
|  |\  \----.|  `--'  |  /  _____  \ |  `----.|  |  |  | 
| _| `._____| \______/  /__/     \__\ \______||__|  |__| 
  • 重新啟動項目,我們就能看到新的圖案了。

關閉banner

有時候我們并不想看到這個banner,我們想關閉它。

只需要我們將main函數里的內容修改為下面的代碼就可以了:

SpringApplication springApplication = new SpringApplication(SpringBootContainerApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);

配置Tomcat

之所以我們不需要引入tomcat是因為SpringBoot幫我們內嵌了tomcat容器。我們在引入SpringBoot的時候,同時依賴引入了tomcat

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>1.5.8.RELEASE</version>
    <scope>provided</scope>
</dependency>

容器相關的配置(不只是tomcat)都在org.springframework.boot.autoconfigure.web.ServerProperties配置類中有定義。所以我們要修改內嵌tomcat容器相關的配置,只需要在application.properties中配置即可。

## 容器端口號,默認8080
server.port=8280
## 上下文路徑,默認/
server.context-path=/tutorial
## tomcat編碼,默認UTF-8
server.tomcat.uri-encoding=UTF-8

具體的配置可以查看源碼。

新建DemoController

新建DemoController,代碼如下:

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping
    public List<Map<String, String>> get(){
        List<Map<String, String>> demos = new ArrayList<>();
        Map<String, String > demo1 = new HashMap<>();
        demo1.put("roach", "小強");
        demo1.put("crow", "烏鴉");
        demos.add(demo1);

        Map<String, String> demo2 = new HashMap<>();
        demo2.put("lion", "獅子");
        demo2.put("tiger", "老虎");
        demos.add(demo2);

        return demos;
    }
}
  • 啟動項目
  • 在瀏覽器中輸入http://localhost:8280/tutorial/demo,查看結果
  • 輸出如下結果:
[
    {
        "roach": "小強",
        "crow": "烏鴉"
    },
    {
        "tiger": "老虎",
        "lion": "獅子"
    }
]

可見我們的配置是生效了的。

使用外置tomcat

  • pom.xml中的<packaging>jar</packaging>修改成<packaging>war</packaging>,即修改打包方式。

  • SpringBootContainerApplication類(注解@SpringBootApplication所在的類)繼承org.springframework.boot.web.support.SpringBootServletInitializer類,并重寫configure方法:

@SpringBootApplication
public class SpringBootContainerApplication extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }
}
  • IDEA配置tomcat,配置項目到tomcat。具體如何配置項目到tomcat,這里不會涉及。當然你也可以先打war包,然后將war包丟到tomcat上。

需要注意的是:application.properties中對容器的配置只對內嵌的有效,對外置的容器是沒有用的。

內嵌tomcat依賴設置

既然用外置的tomcat,那內嵌的就不需要了吧,就可以把依賴去掉了呀!
是的,我們只要把依賴去掉就可以了。

  • 去依賴設置
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

這樣配置我們就能去掉內部的tomcat依賴了

  • 添加servlet-api依賴

去掉tomcat的依賴,但是我們還是要servlet的依賴的,不然我們的項目是啟動不了的。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

內外tomcat皆可

有朋友說,我有時想用內嵌的有時用外置的,看我心情。當然可以,我們只需要單獨將tomcat的依賴加進來就可以。這樣就能覆蓋spring-boot-starter-web依賴進來的tomcat。

  • 在pom.xml中加入如下配置

設置scope是因為我們只需要在編譯的時候用到,打包的時候就不需要了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>1.5.8.RELEASE</version>
    <scope>provided</scope>
</dependency>
  • 在項目根目錄下執行:mvn spring-boot:run,就能使用內置的tomcat運行項目。

項目源碼

參考

《Java EE開發的顛覆者 Spring Boot 實戰》

把spring-boot項目部署到tomcat容器中

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容