背景描述
由于想快速在服務(wù)器上部署一下spring boot的web應(yīng)用,因此使用了java直接啟動(dòng)spring boot內(nèi)置tomcat的方式來(lái)構(gòu)建服務(wù),實(shí)際上這也是spring boot的一個(gè)很大的亮點(diǎn)。
但是接著就遇到了一個(gè)很有意思的問(wèn)題,在項(xiàng)目中使用了Thymeleaf作為模版工具,使用運(yùn)行jar包的方式進(jìn)行項(xiàng)目啟動(dòng)的時(shí)候,訪問(wèn)頁(yè)面時(shí)出現(xiàn)了500錯(cuò)誤,原因?yàn)檎也坏侥0嫖募?br>
然后這一切在本地開(kāi)發(fā)的過(guò)程中并沒(méi)有出現(xiàn),這就讓人非常摸不到頭腦了。
問(wèn)題原因
后來(lái)經(jīng)過(guò)查證和摸索后,想到了可能會(huì)不會(huì)是在controller映射的時(shí)候,使用了錯(cuò)誤的映射地址呢?因?yàn)槲以谂渲媚0娴臅r(shí)候是這么寫的
# Prefix that gets prepended to view names when building a URL.
spring.thymeleaf.prefix=classpath:/templates/
而我在controller里面有的頁(yè)面寫成了這樣的,注意這里的return值,在路徑的最前面加了"/"
@RequestMapping("/admin/index")
private String adminIndex(ModelMap map){
//TODO something
return "/admin/index";
}
經(jīng)過(guò)嘗試修改之后,將多余的"/"去掉之后,一切就正常了。
因此這就非常有意思了,為什么同樣的代碼,我開(kāi)發(fā)啟動(dòng)的時(shí)候就沒(méi)有問(wèn)題,但是使用jar啟動(dòng)的時(shí)候就會(huì)有這個(gè)問(wèn)題呢。
對(duì)比了一下我通過(guò)使用mvn spring-boot:run啟動(dòng)服務(wù)和使用java -jar xx.jar啟動(dòng)服務(wù)時(shí)候的日志差異,發(fā)現(xiàn)前者使用的是target下面的classes文件下下面的內(nèi)容,實(shí)際上在啟動(dòng)中嘗試替換了文件下下面的靜態(tài)文件也確實(shí)生效了。而后者則是使用了jar包這個(gè)Archive下面的classes文件。
2016-07-07 14:44:21 [ main:0 ] - [ INFO ] Starting Application on Lenovo-PC with PID 4320 (G:\java_workspace\xxx\target\classes started by zhf in G:\java_workspace\xxx)
2016-07-07 14:44:21 [ main:32 ] - [ DEBUG ] Running with Spring Boot v1.3.2.RELEASE, Spring v4.2.4.RELEASE
[INFO ] 2016-07-07 14:50:55,844 method:org.springframework.boot.StartupInfoLogger.logStarting(StartupInfoLogger.java:48)
Starting Application v1.0.0-SNAPSHOT on Lenovo-PC with PID 8472 (G:\java_workspace\xxx\target\WebSite-1.0.0-SNAPSHOT.jar started by zhf in G:\java_workspace\xxx\target)
[DEBUG] 2016-07-07 14:50:55,849 method:org.springframework.boot.StartupInfoLogger.logStarting(StartupInfoLogger.java:51)
Running with Spring Boot v1.3.2.RELEASE, Spring v4.2.4.RELEASE
但造成這兩者的具體差異,還需要之后進(jìn)一步分析研究才能知道,目前先記錄下這個(gè)問(wèn)題,之后有時(shí)間了再進(jìn)一步進(jìn)行探索。