1. 程式人生 > >Maven依賴中的scope詳解,在eclipse裡面用maven install可以程式設計成功,到伺服器上用命令執行報VM crash錯誤

Maven依賴中的scope詳解,在eclipse裡面用maven install可以程式設計成功,到伺服器上用命令執行報VM crash錯誤

 Maven依賴中的scope詳解 專案中用了<scope>test</scope>在eclipse裡面用maven install可以編譯成功,到伺服器上用命令執行報VM crash錯誤,原因是test程式碼提交上去了,但沒有對應的junit包導致的

解決辦法:1.伺服器上編譯的時候排除掉test程式碼。2.把<scope>test</scope>改成<scope>compile</scope>

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

改成下面:

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>compile</scope>
        </dependency>

Maven是慣例優於配置(Convention Over Configuration), Maven預設的依賴配置項中,scope的預設值是compile。

scope的分類

compile

預設compile,什麼都不配置也就是意味著compile。compile表示被依賴專案需要參與當前專案的編譯,當然後續的測試,執行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。

test

scope為test表示依賴專案僅僅參與測試相關的工作,包括測試程式碼的編譯,執行。比較典型的如junit。

runntime

runntime表示被依賴專案無需參與專案的編譯,不過後期的測試和執行週期需要其參與。與compile相比,跳過編譯而已,說實話在終端的專案(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,具體實現是runtime的,compile只需要知道介面就足夠了。oracle jdbc驅動架包就是一個很好的例子,一般scope為runntime。另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實現,也可以用B實現。

provided

provided意味著打包的時候可以不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上可以參與編譯,測試,執行等週期。相當於compile,但是在打包階段做了exclude的動作。

system

從參與度來說,也provided相同,不過被依賴項不會從maven倉庫抓,而是從本地檔案系統拿,一定需要配合systemPath屬性使用。

scope的依賴傳遞

A–>B–>C。當前專案為A,A依賴於B,B依賴於C。知道B在A專案中的scope,那麼怎麼知道C在A中的scope呢?答案是:
當C是test或者provided時,C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承於B的scope。