SpringBoot 項目運行在 tomcat7 上

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 沒有報錯了。真的是坑。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章