文章目錄
外部Tomcat
springboot 項目部署到外部tomcat
Spring Boot:內置tomcat啓動和外部tomcat部署總結
網上的部署到外部Tomcat的例子足夠多,這裏精簡步驟,方便記憶。
1. 改成war方式打包
在 pom.xml 設置:
<packaging>war</packaging>
<build>
<plugins>
<!-- 把原來的 spring-boot-maven-plugin 註釋掉/刪掉-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
</plugin>
</plugins>
<finalName>springbootdemo</finalName>
</build>
2. 移除對SpringBoot中的嵌入式Tomcat的依賴
- 需要移除對嵌入式Tomcat的依賴,這樣打出的war包中,在lib目錄下才不會包含Tomcat相關的jar包,否則將會出現啓動錯誤。
- 因爲SpringBootServletInitializer需要依賴 javax.servlet,而tomcat-embed-jasper下面的 tomcat-embed-core 中就有這個 javax.servlet,如果沒用provided,最終打好的war裏面會有servlet-api這個jar,這樣就會跟tomcat本身的衝突了。
還有一個很關鍵,就是tomcat-embed-jasper中scope必須是provided。
在 pom.xml 添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
3. 修改SpringBoot的啓動類
- 修改啓動類,使其繼承SpringBootServletInitializer類,重寫configure方法。
- 如果SpringBoot幫我們建立了SpringBootServletInitializer類文件,直接刪掉,修改最開始的SpringBootApplication 項目啓動類,就是有main方法的那個。
@SpringBootApplication
@ServletComponentScan
@ComponentScan(basePackages = {"com.example.controller", "com.example.service"})
@MapperScan(basePackages = {"com.example.dao"})
public class SpringbootdemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootdemoApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
注:根據情況,可以在 pom.xml 修改打包名稱
<build>
<finalName>springbootdemo</finalName>
</build>
4. 在IDEA裏用外部Maven打包,用外部Tomcat運行
4.1 提前設置外部Tomcat
系統已裝有Tomcat,平常想在IDEA裏邊使用這個“外部”的Tomcat,可以先在IDEA設置:
File - Settings - Application Server,新增、添加系統已安裝的Tomcat目錄
4.2 提前設置外部Maven
在IDEA用Maven打包,我也用的外部Maven,IDEA設置:
注意:IDEA,特別是18年或者19年的新版本,Default Settings 變成了 Settings for New Projects,安裝新版的IDEA後先別急着新建工程,先在初始頁面的 Settings for New Projects 設置好系統的外部Maven,不然在IDEA裏使用的Maven總是被改回IDEA的默認Maven而不是要使用的外部Maven。不然更換編輯器IDE的時候Maven的不同會變得麻煩。
4.3 Maven打包
IDEA,Maven界面,先clean清除已生成的targets,然後package打包war。
注:打包要跳過Maven的測試的話,點擊Maven界面按鍵欄的淺藍色圓圈按鍵,鼠標懸停顯示“Skip Tests”,可見 Lifecycle下的 test 被標註了刪除線:
package後,在控制欄會有 “BUILD SUCCESS”,說明打包成功。
4.4 使用外部Tomcat啓動
點擊Run旁邊的 Edit Configurations,點擊加號“+”按鍵,別去 Templates 裏邊找!
往下拉,找到 Tomcat Server 並進入,選擇Local,默認是Unnamed,提示“No artifacts marked for deployment”
修改Unnamed名稱(隨意),進入Deployment,看見Nothing to Deploy:
點擊右邊豎排加號“+”按鍵,選擇Artifact…
選擇war,即普通打war包
- 注意這個,根據需要可修改:
選擇war exploded,即熱部署,修改jsp等文件能直接顯示修改:
到這裏,外部Tomcat設置基本完成,點擊OK完成,Run這裏會出現:
可以Run了。
- 注意:要檢查項目的 Project Structure
war的輸出路徑是否爲 target:
於是順便檢查一下 Project的SDK版本、language level, Modules,SDKs的JDK 。
遇到問題
- 環境:WIN7 x64
SpringBoot 2.1.7,在IDEA新建的從 start.spring.io 生成,純淨
系統安裝的Tomcat版本:8.0.53
用SpringBoot內部Tomcat正常啓動;
用IDEA的“外部”Tomcat無法啓動,都報錯:
failed to extract parameter names for org.apache.ibatis.mapping.resultmap...
Failed to start component [StandardEngine[Catalina].StandardHost[localhost]...
......
想看詳細的Tomcat日誌,必須去找IDEA自己的項目生成的日誌,日誌文件在 :
C:\Users\Administrator\.IntelliJIdea2019.1\system\tomcat\Unnamed_springbootdemo\logs
看了日誌中報錯的部分,應該是連Tomcat都沒能啓動,然後才導致了接下來一堆問題,各種Bean不能註冊等等。
各種嘗試,最後發現是Tomcat版本問題!!!
啓動一個SpringBoot 2 工程,查看到內部Tomcat版本:9.0.22
於是搜索,帶有高版本Tomcat的SpringBoot的war,放到低版本Tomcat運行的話,
要指定Tomcat版本:
<properties>
<!--外部Tomcat版本-->
<tomcat.version>8.0.53</tomcat.version>
</properties>
springboot 項目部署到外部tomcat
SpringBoot應用部署到Tomcat中無法啓動問題
依舊不行!
於是搜索 SpringBoot 2+ 的特性,發現至少要 Tomcat 8.5:
What’s New in Spring Boot 2? SpringBoot2新特性
於是,直接安裝更合適的Tomcat版本,
或卸載原來的Tomcat後安裝更合適的Tomcat版本:
如何安裝和配置兩個不同版本的tomcat
接着IDEA裏使用 Tomcat 9.0.22 啓動,運行正常;
把war包扔到webapps目錄讓其自動部署,運行正常!
可以嘗試繼續指定外部Tomcat版本:9.0.22
<properties>
<!--外部Tomcat版本-->
<tomcat.version>9.0.22</tomcat.version>
</properties>