問題場景:
領導讓我搭建一套Jenkins實現自動化部署,項目是SpringCloud項目,配置的過程很順利,給我提供了一台服務器做部署測試(服務器以前是做dev環境,很長時間沒人用了)
我把所有項目配置上,但至少一半構建失敗,異常信息:[main] INFO o.a.catalina.core.StandardService -Stopping service [Tomcat]
啟動日志的最后一行就是這個,沒有任何有用的信息,找了很多資料,耽誤了2天時間終於解決了。
解決思路:首先要明確一點,既然是Tomcat自動停止了,肯定是有代碼報錯,只是你的項目沒有打印錯誤日志。
解決辦法:
1. 給啟動類加上try..catch...並打印catch的信息。
@SpringBootApplication public class Application { static Logger logger = LoggerFactory.getLogger(Application .class); public static void main(String[] args) { try { SpringApplication.run(Application .class, args); logger.info("啟動成功!"); } catch (Exception e) { logger.error("啟動異常", e); } } }
2. 由於Tomcat的默認日志工具和SpringCloud的默認日志工具是不一樣的:Tomcat使用的是log4j;SpringBoot使用的是Logback。
我配置的也是Logback,所以只能輸出logback日志,而tomcat的log4j的日志並沒有輸出。這種情況我們采用Slf4j,Slf4j並不是日志輸出工具,他的作用是日志繼承接口,用於整合不同的日志工具。
<dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId>
<version>1.8.0-beta4</version> </dependency>
這個依賴可以將log4j輸出到slf4j,從而用sl4j輸出。
經過這兩個配置就可以看到錯誤日志了。
我的錯誤信息是: java.lang.IllegalArgumentException: Could not resolve placeholder 'kafka.ip' in value "${kafka.ip}"
配置文件都放在Spring Cloud Config里,我用idea本地使用dev服務器的配置是可以正常啟動的。再檢查服務器里的配置文件,發現config的文件是讀取本地的, 並不是實時從git上來取,如下圖:
config-common.properties config-log.properties config-mongodb.properties config-mysql.properties ........
在服務器上每個項目目錄有一個config文件夾,config文件夾有配置:application.properties bootstrap.properties logback-spring.xml

SpringCloud的jar啟動原則,如果本地有config和lib文件夾,是不會讀取jar包里面的config和lib的。我的問題在於bootstrap.properties不是最新的,重新傳一份再執行java命令,啟動成功。
