1. 程式人生 > 程式設計 >SpringBoot打成war包在tomcat或wildfly下執行的方法

SpringBoot打成war包在tomcat或wildfly下執行的方法

springboot預設的打包方式為jar包,jar包的有優點是不需要更改的配置,並且內嵌了tomcat,如果打成jar包直接可以丟到docker中執行測試。但是考慮到前端程式碼只能打成war包,因此乾脆也將後端程式碼打成war包和前端的程式碼一起放在tomcat容器中的webapps中執行就好了。

SpringBoot打包形式

預設情況下,建立的SpringBoot專案是按照jar包形式來進行打包的。同時,內建了tomcat的容器。

那麼,此時如果想讓springboot打包成war包,並部署到wildfly等容器,該如何處理?

下面將從建立專案開始逐一講解。

建立專案

建立專案沒有什麼難點,使用idea工具建立一個簡單的maven專案即可,如果你的專案已經是springboot專案,想要修改為war包形式,對照修改即可。

修改pom.xml配置

建立專案之後,修改pom.xml檔案,新增parent標籤。

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.5.RELEASE</version>
  <relativePath/>
</parent>

如果原來是springboot專案,則已經包含了,不用修改。

pom.xml中設定打包方式為war。

<packaging>war</packaging>

新增或修改dependency配置,如下:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
      <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

其中在spring-boot-starter-web中需要排除tomcat的依賴。同時,新增servlet-api的依賴。注意這裡新增的依賴為Servlet2.5。

在build中使用如下外掛進行打包。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-war-plugin</artifactId>
      <version>2.6</version>
      <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
      </configuration>
    </plugin>
  </plugins>
</build>

啟動main方法

如果已經存在啟動的main方法,則讓main方法繼承SpringBootServletInitializer,並實現其方法即可。如果是新建立專案,則直接在頂級目錄建立SpringBootApp(啟動類),然後啟動diam如下。

@SpringBootApplication
public class SpringBootApp extends SpringBootServletInitializer {
 public static void main(String[] args) {
 SpringApplication.run(SpringBootApp.class,args);
 }
 @Override
 protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
 return builder.sources(SpringBootApp.class);
 }
}

打包

通過maven命令執行package打包即可,在target目錄下即可生成war包。

至於tomcat和wildfly的部署,都可將war包放置於對應的目錄下啟動服務即可。

異常情況

如果在啟動時報如類似如下異常(提示缺少web.xml):

Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)

注意檢查pom檔案打包外掛和是否排除了tomcat的問題,核查上面的打包外掛是否正確。

問題的原因是:springboot專案中引用了依賴包spring-boot-starter-web。該包中引用的spring-boot-starter-tomcat裡包含了tomcat嵌入式servlet容器,其不同版本實現的是不同的servlet版本規範。

Servlet/JSP版本2.5/2.1支援Tomcat的版本為6.0.x,最低java版本為1.5。Servlet/JSP版本3.0/2.2支援Tomcat的版本為7.0.x,最低java版本為1.6。

由於上面使用了Servlet2.5,當沒有web.xml檔案時會出現上面的異常。

解決方式一:當Servlet版本小於3時,使用建立/src/main/webapp/WEB-INF/web.xml檔案。

解決方式二:在pom.xml的build下新增maven-war-plugin外掛。並設定failOnMissingWebXml為false。

總結

以上所述是小編給大家介紹的SpringBoot打成war包在tomcat或wildfly下執行的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!