SpringBoot 項目如何打成 war 包
SpringBoot項目的默認打包方式是將工程打包成爲一個 jar 包。部分情況下,我們需要將項目打包成一個 war 包,以方便我們將工程部署在 tomcat 上運行。
那如何將 SpringBoot 項目打包成一個 war 包呢?
##pom 文件修改
修改打包方式。由於 SpringBoot 的默認打包方式將其打包成 jar 包,所以創建出來的項目的 pom是沒有特殊聲明 packaging 的元素。所以首先要在 pom 座標處增加<packaging>war</packaging>
的設置。
因爲使用的 SpringBoot,而且選中了 web的 start,其內置 tomcat服務,但是我們這裏又需要手動將其部署到 tomcat 上,所以要將 spring-boot-start-web 中移除對spring-boot-start-tomcat 的依賴傳遞,所以pom 文件中需要這樣修改。
<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>
然後 pom 中添加 servlet-api 的依賴。下面有兩種方法,可以任選其中一個
方法一:
<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>
最後將 pom 文件中<build>元素中添加元素<fileName>並賦值爲你需要的打包的名字,比如我這邊的手頭的這個例子,我希望打出來的 war 包名字爲 dataServer.war。所以我的設置是這樣的。
<finalName>dataServer</finalName>
到目前爲止所有的pom 修改就已經完成了,現在需要修改啓動類,並重寫初始化方法
重寫初始化方法
我們平常用main方法啓動的方式,都有一個App的啓動類,代碼如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
我們需要類似於web.xml的配置方式來啓動spring上下文了,在Application類的同級添加一個SpringBootStartApplication類,其代碼如下:
/**
* 修改啓動類,繼承 SpringBootServletInitializer 並重寫 configure 方法
*/
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意這裏要指向原先用main方法執行的Application啓動類
return builder.sources(Application.class);
}
}
打包
在項目根目錄下(即包含pom.xml的目錄),在命令行裏輸入: mvn clean package
即可, 等待打包完成,出現[INFO] BUILD SUCCESS
即爲打包成功。
如何在 tomcat8 上運行
把target目錄下的war包放到tomcat的webapps目錄下,啓動tomcat,即可自動解壓部署。 最後在瀏覽器中輸入**http://localhost:[端口號]/[打包項目名]/**即可瀏覽。
我再 tomcat8 上運行沒有發現什麼問題,然後我將程序部署到了服務器上卻出現了問題。服務器上 的 tomcat 版本是 7.所以我在本地重新部署了一套 tomcat7 的運行環境用來測試,結果卻意外發現了大問題。
如何在 tomcat7 上運行
在 tomcat7 上運行打好的包的時候出現了這樣的一個錯誤。我曾在Stack Overflow 上進行查找,找到一個比較靠譜的解釋。大致是說,之所以在 tomcat8 上可以運行,而 tomcat7 上不能運行,是因爲 tomcat8中已經包含 el-api 3.0而 tomcat7 上只有el-api 2.2。
解決方法也說的是五花八門,我嘗試過很多種方法,最後是一個意想不到的方法幫助我解決了這個問題。
看了網上所說,把tomcat/lib下的el-api.jar拷貝到D:\xxx\jdk1.8.0_121\jre\lib\ext發現還是一樣的異常;反編譯el-api的確沒有ElManager,在el-api3.0才引入.so ,下載el-api3.0.jar,放到jdk或者只放tomcat/lib都可;(直接使用tomcat8也可解決)
然後我將本地 maven 倉庫中的el-api3.0 copy 到了 tomcat7 的 lib 路徑下,然後將文件放進去,再次使用 catalina 執行 tomcat 沒有報錯了。真的是坑。。。