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的屬性來定義路徑。