SpringBoot使用IDEA設定的外部Tomcat啟動,遇到的問題和解決
文章目錄
外部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>
相關文章
- SpringBoot 使用外部Tomcat方法及啟動原理Spring BootTomcat
- 最近遇到的問題和解決辦法
- win10 U盤啟動安裝 ubuntu 遇到的問題和解決方式Win10Ubuntu
- GT911驅動遇到的問題和解決方案
- Composer 使用過程中遇到的問題和解決方案
- 刪除一個使用者遇到的問題和解決
- springboot2.0使用外部tomcat進行啟動方法Spring BootTomcat
- 設定SecureCRT配色和解決亂碼問題Securecrt
- Tomcat中文亂碼問題的原理和解決方法Tomcat
- SpringBoot使用外部tomcatSpring BootTomcat
- Springboot使用avue拖動上傳遇到的問題Spring BootVue
- 解決tomcat啟動控制檯輸出中文亂碼問題-ideaTomcatIdea
- 最新 IDEA 和 Maven 整合問題和解決IdeaMaven
- dataguard中MRP無法啟動的問題分析和解決
- 求解救:使用 docker 啟動 jenkins 遇到的問題。DockerJenkins
- springboot使用外部tomcat啟動,整合jsp,另有整合dubbo樣例Spring BootTomcatJS
- ElasticSearch啟動失敗問題彙總和解決方法Elasticsearch
- MVVM框架從WPF移植到UWP遇到的問題和解決方法MVVM框架
- SpringBoot遇到的某些問題Spring Boot
- hadoop啟動遇到的各種問題Hadoop
- CKEditor使用中遇到的問題解決
- 解決在使用Amoeba遇到的問題
- Kettle 在應用中遇到的一些問題和解決方法
- idea之設定web工程的TomcatIdeaWebTomcat
- SpringBoot學習——@Autowired自動注入報:could not be found問題的理解和解決方案Spring Boot
- 非oracle安裝使用者/組成員使用10203遇到的問題和解決Oracle
- 如何解決dell win10你的電腦遇到問題需要重新啟動的問題Win10
- 配置springboot專案使用外部tomcatSpring BootTomcat
- SpringBoot配置外部Tomcat專案啟動流程原始碼分析(長文)Spring BootTomcat原始碼
- tomcat高訪問設定問題Tomcat
- nginx和Tomcat整合後發生的重定向問題分析和解決NginxTomcat
- springboot結合rocketmq的使用以及遇到的問題Spring BootMQ
- 實施vertex compression所遇到的各種問題和解決辦法
- oracle10g在RAW上建庫遇到的問題和解決方法Oracle
- 浮動元素引起的問題和解決辦法?
- 浮動元素引起的問題和解決辦法
- 使用laradock啟動容器elasticsearch遇到啟動後幾秒鐘又自動關閉的問題以及解決方法Elasticsearch
- CentOS7中啟動Tomcat後,8080埠不能被外部訪問的解決辦法。CentOSTomcat