先,已經(jīng)有現(xiàn)成的打包成jar的spring boot項(xiàng)目。
我們既然想使用外部servlet容器,那就需要移除SpringBoot的內(nèi)置tomcat。在pom.xml中添加如下內(nèi)容:
<!--這里修改了內(nèi)置Tomcat的作用域-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
scope的可選值以及介紹:
compile:默認(rèn)就是compile,什么都不配置也就是意味著compile。compile表示被依賴項(xiàng)目需要參與當(dāng)前項(xiàng)目的編譯,當(dāng)然后續(xù)的測試,運(yùn)行周期也參與其中,是一個(gè)比較強(qiáng)的依賴。打包的時(shí)候通常需要包含進(jìn)去。
test:scope為test表示依賴項(xiàng)目僅僅參與測試相關(guān)的工作,包括測試代碼的編譯,執(zhí)行。比較典型的如junit。
runtime:runntime表示被依賴項(xiàng)目無需參與項(xiàng)目的編譯,不過后期的測試和運(yùn)行周期需要其參與。與compile相比,跳過編譯而已,說實(shí)話在終端的項(xiàng)目(非開源,企業(yè)內(nèi)部系統(tǒng))中,和compile區(qū)別不是很大。比較常見的如JSR×××的實(shí)現(xiàn),對應(yīng)的API jar是compile的,具體實(shí)現(xiàn)是runtime的,compile只需要知道接口就足夠了。Oracle jdbc驅(qū)動(dòng)架包就是一個(gè)很好的例子,一般scope為runntime。另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實(shí)現(xiàn),也可以用B實(shí)現(xiàn)。
provided:provided意味著打包的時(shí)候可以不用包進(jìn)去,別的設(shè)施(Web Container)會(huì)提供。事實(shí)上該依賴?yán)碚撋峡梢詤⑴c編譯,測試,運(yùn)行等周期。相當(dāng)于compile,但是在打包階段做了exclude的動(dòng)作。
system:從參與度來說,與provided相同,不過被依賴項(xiàng)不會(huì)從maven倉庫抓,而是從本地文件系統(tǒng)拿,一定需要配合systemPath屬性使用。
/**
* 修改啟動(dòng)類,繼承 SpringBootServletInitializer 并重寫 configure 方法
*/
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意這里要指向原先用main方法執(zhí)行的Application啟動(dòng)類
return builder.sources([啟動(dòng)類].class);
}
}
當(dāng)項(xiàng)目打包設(shè)置成war后,項(xiàng)目的文件結(jié)構(gòu)還不是我們預(yù)期的,缺少WEB-INF,webapp等,有兩個(gè)方法補(bǔ)齊,一手動(dòng)創(chuàng)建目錄二配置idea自動(dòng)創(chuàng)建。這里采用第二種。
打開project structure
整體目錄結(jié)構(gòu)如下:
啟動(dòng)tomcat,測試一下吧。正常情況下應(yīng)該是瀏覽器自動(dòng)跳轉(zhuǎn)到index.html頁面了。
事問了,打成war不能執(zhí)行,報(bào)錯(cuò),找了好久找不到原因,今天自己也碰到這個(gè)問題,一樣的。
原因是servlet關(guān)聯(lián)沒有,二是啟動(dòng)時(shí)調(diào)用原始的啟動(dòng)類
解決方案如下:
pom.xml
1、打war
<packaging>war</packaging>
2、去掉關(guān)聯(lián),可選步驟
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
3、添加servlet-api的依賴(下面任一)
<!--要放到tomcat中運(yùn)行,war的方式,加這個(gè),否則不用加-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.36</version>
<scope>provided</scope>
</dependency>
4、增加啟動(dòng)再調(diào)用原始的main類
若原始的啟動(dòng)類是:AdminApplication,那么在同包中,增加如下的文件
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* 增加這個(gè)類,修改啟動(dòng)類,繼承 SpringBootServletInitializer 并重寫 configure 方法
*/
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意這里要指向原先用main方法執(zhí)行的Application啟動(dòng)類
return builder.sources(AdminApplication.class);
}
}
或者啟動(dòng)類改成
項(xiàng)目需要將前端部署到tangweb7.0,所以需要將vue前端打包成war包,可以進(jìn)行如下操作:
1、先生成dist,命令行cmd中切換到項(xiàng)目目錄下(cd 項(xiàng)目文件夾),運(yùn)行命令: npm run build
2、生成完成后在cmd中再切到dist目錄下,運(yùn)行命令:jar -cvf dist.war *,打包完成
3、tangweb7.0 部署完成后報(bào)404,還沒有解決。。。
如圖所示,如果哪位有遇到過此類問題,可以告訴我一下,多謝。
截圖2主要提示內(nèi)容:we're sorry but xxx doesn't work properly without javascript enabled. please enabled it to conitnue 。已百度查過相關(guān)問題,加了web.xml文件,然后再打包還是此問題,所以懷疑是哪里配置的不對,或者打包是不是需要做什么修改調(diào)整。
ps:如果有其他信創(chuàng)的web容器也可以推薦一下,最好是免費(fèi)的或者是費(fèi)用低的。
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。