Spring Boot專案部署到外部Tomcat

芸靈fly發表於2018-03-10

說明

Spring Boot自帶Tomcat外掛,可以直接編寫啟動類,開啟Tomcat服務,但是在實際開發中,伺服器一般是已經建好了的,由專人維護,因此不能用Spring Boot自帶的Tomcat,而是應將我們的Spring Boot專案打包成war釋出到外部的伺服器如Tomcat

開發環境

MyEclipse2017、JDK 1.8、Tomcat 7.0.77

開發步驟

1 搭建Spring Boot專案

首先需要在MyEclipse搭建一個Spring Boot專案,可以參考我的上一篇文章 MyEclipse搭建Spring Boot

首先給出專案結構:


2 配置pom.xml檔案

需要去除Tomcat外掛、新增thymeleaf依賴、unbescape依賴,配置Tomcat版本、打包的war名稱等等,筆者都有註釋

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>yunlingfly</groupId>
	<artifactId>MavenSpringBoot</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	
	<!-- 繼承父包 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.3.RELEASE</version>
		<relativePath></relativePath>
	</parent>

	<name>MavenSpringBoot Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope><!-- 去除Spring Boot自帶的Tomcat外掛 -->
		</dependency>

		<!--  <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>-->

		<!-- thymeleaf包含上面註釋了的依賴 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		
		<!-- 沒有下面這句會報NoClassDefFoundError: org/unbescape/html/HtmlEscape錯誤 -->
		<dependency>
			<groupId>org.unbescape</groupId>
			<artifactId>unbescape</artifactId>
			<version>1.0</version>
		</dependency>
		
		<!-- 測試工具配置 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<!-- 配置低版本Tomcat,否則需8.5以上版本,請根據自己的Tomcat版本配置 -->
	<properties>
		<tomcat.version>7.0.77</tomcat.version>
	</properties>

	<build>
		<finalName>MavenSpringBoot</finalName>
		<plugins>
			<!-- war部署使用 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<warName>MavenSpringBoot</warName><!-- 設定打包後war包的名字 -->
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
3 編寫程式

1)啟動類:SpringBootTest.java

程式的入口啟動,需要繼承SpringBootServletInitializer、重寫configure方法(啟動類只能有一個,不能放在根目錄default package,並且需要位於其他類同級目錄或最上級目錄,這樣啟動類才能呼叫其他類,我放在了同級目錄,請參照上面的專案結構貼圖)

package test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

// @SpringBootApplication宣告讓spring boot自動給程式進行必要的配置
@SpringBootApplication
public class SpringBootTest extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootTest.class, args);
	}
	
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(SpringBootTest.class);
    }
}

2)控制類:TemplateController.java

用於配置攔截字首和轉向等

package test;

import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TemplateController {
	// 配置攔截字首
	@RequestMapping("/hello")
	public String hello(Map<String, Object> map) {
		map.put("hello", "from TemplateController.helloHtml");
		// 使用thymeleaf省略檔案位置/templates/和字尾.html
		return "/hello";
	}
}

3)配置類與配置檔案:Config.java與application.properties

用於配置WebMVC介面卡

package test;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class Config extends WebMvcConfigurerAdapter{
    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

在/src/main/resources資料夾下新建application.properties檔案,用於配置上下文和thymeleaf

#配置上下文
server.contextPath=/MavenSpringBoot
#配置錯誤頁面的請求路徑
#error.path=/error

#配置thymeleaf檔案位置
spring.thymeleaf.prefix=classpath:/templates/
#配置thymeleaf字尾
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
#開發時關閉快取,否則你必須重新執行spring-boot的main()方法才能看到頁面更改的效果。
spring.thymeleaf.cache=false
說明:Maven資原始檔的約定目錄結構 
Maven的資原始檔目錄:/src/java/resources
spring-boot專案靜態檔案目錄:/src/java/resources/static
spring-boot專案模板檔案目錄:/src/java/resources/templates

spring-boot靜態首頁的支援,即index.html放在以下目錄結構會直接對映到應用的根目錄下:

classpath:/META-INF/resources/index.html
classpath:/resources/index.html
classpath:/static/index.html
calsspath:/public/index.html

4)前端頁面:在/src/main/resources資料夾下新建templates檔案再在templates資料夾下新建hello.html與index.html,注意引入thymeleaf

hello.html:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"><!-- 注意引入thymeleaf -->
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1 th:inline="text">Hello.v.2</h1>
        <p th:text="${hello}"></p>
    </body>
</html>

index.html:

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"><!-- 注意引入thymeleaf -->
<head lang="en">
<meta charset="UTF-8" />
<title>index</title>
</head>
<body>
	你好
</body>
</html>
4 部署

專案右鍵Run As->Maven clean(清除快取),然後Run As->Maven install(打包成war)


之後就可以在target資料夾下找到打包好的war檔案(再次生成可以直接將target下的該war刪除,然後右鍵Run As->Maven clean,Run As->Maven install即可再次生成修改過的war包)


將該war包放入Tomcat的webapps資料夾下,執行Tomcat,Tomcat自動解壓war檔案後,筆者以自己機器的Tomcat 7.0.77為例(本機),開啟瀏覽器輸入http://127.0.0.1:8080/MavenSpringBoot/hello即可看到效果,最後附上筆者的完整war包供參考,CSDN下載:https://download.csdn.net/download/weixin_38187317/10279091


注:localhost與127.0.0.1與本機IP的區別(百度):

1、127.0.0.1是回送地址,指本地機,一般用來測試使用。回送地址是本機回送地址(Loopback Address),即主機IP堆疊內部的IP地址,主要用於網路軟體測試以及本地機程式間通訊,無論什麼程式,一旦使用回送地址傳送資料,協議軟體立即返回,不進行任何網路傳輸。
2、localhost是本地DNS解析的127.0.0.1的域名,這個你開啟本機的hosts檔案就可以看到,一般位於c:\windows\system32\driver\etc下,一般在最後有這麼一行:
127.0.0.1        localhost
而這個localhost你可以隨意更改,如果改成百度,新浪之類的www.baidu.com重啟你再試一下,就會發現很有意思了。
3、本機IP則指你連到網路上的IP地址,可以是內網地址,當然也可能是公網IP,這個就是你實際利用TCP/IP協議與網上計算機通訊時使用的IP了。


相關文章