1. 程式人生 > >spring boot 專案中使用provided打包成war到tomcat執行出現的問題總結

spring boot 專案中使用provided打包成war到tomcat執行出現的問題總結

       大家知道 spring boot 專案是自帶tomcat 的,但是我們有時候是需要把專案打包成war 然後放到獨立的tomcat中執行的,這個時候我們就需要將它自帶的tomcat給排除開,這時候我們就可以使用<scope>provided</scope>來實現,我們在pom檔案中這樣寫:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

      provided 依賴只有在當JDK 或者一個容器已提供該依賴之後才使用。比如說,我們開發了一個web 應用,在編譯

classpath 中需要可用的Servlet API 來編譯一個servlet,但是我們並不需要打包好的WAR 中包含這個Servlet API,因為這個

Servlet API JAR 可以由我們的應用伺服器或者servlet 容器提供。<scope>provided</scope>提供範圍的依賴在編譯classpath的

時候是可用的,這種依賴不是傳遞性的,當然也不會被打包到war當中。比如說:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0-alpha-1</version>
    <!--只在編譯或測試的時候使用-->
    <scope>provided</scope>
</dependency>

     我自己在有一次 spring boot 專案釋出到獨立的 tomcat 中的時候就出現了由於<scope>provided</scope>引起的問題,我在專案中使用了ehcache快取,我在複製程式碼的時候多餘地複製了<scope>provided</scope>進去,釋出專案啟動的時候啟動不了,報錯,找不到相關的 net.sf.ehcache 類檔案,後面一查是因為多了<scope>provided</scope>,將其去掉之後執行成功,這裡也做個記錄。

  

      最後,我們來看一下scope的幾個屬性詳解:

     1.compile:預設值 他表示被依賴專案需要參與當前專案的編譯,還有後續的測試,執行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。

     2.test:依賴專案僅僅參與測試相關的工作,包括測試程式碼的編譯和執行,不會被打包,例如:junit。

     3.runtime:表示被依賴專案無需參與專案的編譯,不過後期的測試和執行週期需要其參與。與compile相比,跳過了編譯而已。例如JDBC驅動,適用執行和測試階段。

     4.provided:打包的時候可以不用包進去,別的設施會提供。事實上該依賴理論上可以參與編譯,測試,執行等週期。相當於compile,但是打包階段做了exclude操作。

    5.system:從參與度來說,和provided相同,不過被依賴項不會從maven倉庫下載,而是從本地檔案系統拿。需要新增systemPath的屬性來定義路徑。