一、前言
SpringBoot內置tomcat使用很方便,打包成可執行jar文件后可以直接運行,然后內置Tomcat配置終究沒有外部獨立Tomcat方便,並且如果有多個web應用,使用外部獨立Tomcat管理起來也更加方便。因此,這邊文章介紹一下本人將myblog應用部署到外部Tomcat的過程以及其中遇到的一些問題與解決方法。
二、打包成可部署到Tomcat的war包
將應用打成war包,需要進行以下幾個步驟:
1.修改打包形式
將原來的jar打包形式<packaging>jar</packaging>改成war打包形式<packaging>war</packaging>。打jar包的插件仍然可以保留,不沖突。
2.移除嵌入式tomcat插件
在pom.xml里找到spring-boot-starter-web依賴節點,在其中添加如下代碼:
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 <!-- 移除嵌入式tomcat插件 --> 5 <exclusions> 6 <exclusion> 7 <groupId>org.springframework.boot</groupId> 8 <artifactId>spring-boot-starter-tomcat</artifactId> 9 </exclusion> 10 </exclusions> 11 </dependency>
3.將Tomcat依賴修改為本地調試模式
為了本地調試方便,在pom.xml文件中,dependencies下面的tomcat依賴修改為:
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 <exclusions> 5 <exclusion> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-tomcat</artifactId> 8 </exclusion> 9 </exclusions> 10 </dependency>
4.修改啟動類
常規Springboot應用啟動類為Application:
1 package com.guigui.blog; 2 import org.springframework.boot.SpringApplication; 3 import org.springframework.boot.autoconfigure.SpringBootApplication; 4 import org.springframework.cache.annotation.EnableCaching; 5 import org.springframework.transaction.annotation.EnableTransactionManagement; 6 @SpringBootApplication 7 @EnableTransactionManagement 8 @EnableCaching 9 public class Application { 10 public static void main(String[] args) { 11 SpringApplication.run(Application.class, args); 12 } 13 }
我們需要類似於web.xml的配置方式來啟動spring上下文,在Application類的同級添加一個SpringBootStartApplication類,其代碼如下:
1 package com.guigui.blog; 2 import org.springframework.boot.builder.SpringApplicationBuilder; 3 import org.springframework.boot.web.support.SpringBootServletInitializer; 4 /** 5 * 修改啟動類,繼承 SpringBootServletInitializer 並重寫 configure 方法 6 */ 7 public class SpringBootStartApplication extends SpringBootServletInitializer { 8 @Override 9 protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 10 // 注意這里要指向原先用main方法執行的Application啟動類 11 return builder.sources(Application.class); 12 } 13 }
5.打包部署
在項目根目錄下(即包含pom.xml的目錄),在命令行里輸入:
1 mvn clean package
即可, 等待打包完成,出現[INFO] BUILD SUCCESS即為打包成功。然后把target目錄下的war包放到tomcat的webapps目錄下,啟動tomcat,即可自動解壓部署。 最后在瀏覽器中輸入:
http://localhost:[端口號]/[打包項目名]/
發布成功。
三、遇到問題
1.訪問路徑問題
部署到外部tomcat之后,請求的URL需要在端口號加上項目名才可以正常訪問,這樣頁面中各種資源的訪問都需要加上相應的項目名稱,為了保證常規Springboot應用訪問資源也不會出現問題,需要將Springboot應用配置為帶項目名前綴訪問,application.yml文件改動:
1 server: 2 context-path: /myblog
這樣兩種方式的請求URL就是一樣的了。
由於項目名稱通過具體的部署情況,名稱可能不一樣,所以在js或者ftl等頁面文件中使用的項目名稱不能寫死,需要動態獲取,下面給出js和ftl文件動態獲取項目名稱方式:
- 1.ftl獲取當前項目名稱:
1 <#assign basePath=request.contextPath> 2 <!-- 具體使用 --> 3 <link href="${basePath}/vendor/admin/bootstrap/css/bootstrap.min.css" rel="stylesheet">
- 2.js中獲取當前項目名稱:
1 function getRootPath() { 2 var strPath = window.document.location.pathname; 3 var postPath = strPath.substring(0, strPath.substr(1).indexOf('/') + 1); 4 return postPath; 5 }
2.字體資源無法訪問導致icon圖標顯示失敗問題
Spring Boot + Bootstrap 出現"Failed to decode downloaded font"和"OTS parsing error: Failed to convert W 錯誤。導致所有圖標顯示不出。
通過各種百度和Google搜索,找到原因:
因為經過maven的filter,會破壞font文件的二進制文件格式,到時前台解析出錯。
解決方案:
設置filter,font文件不需要filter,具體pom文件配置如下:
1 <resource> 2 <directory>src/main/resources</directory> 3 <targetPath>${basedir}/target/classes</targetPath> 4 <filtering>true</filtering> 5 <excludes> 6 <exclude>static/vendor/**/fonts/**</exclude> 7 </excludes> 8 </resource> 9 <resource> 10 <directory>src/main/resources</directory> 11 <targetPath>${basedir}/target/classes</targetPath> 12 <filtering>false</filtering> 13 <includes> 14 <include>static/vendor/**/fonts/**</include> 15 </includes> 16 </resource>
重新編譯整個工程,解決問題。
