SpringBoot應用部署到外部Tomcat


一、前言

       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>

重新編譯整個工程,解決問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM