Maven <scope>: provided、 compile、import

scope=compile(默認)

對於scope=compile的情況(默認scope),也就是說這個項目在編譯,測試,運行階段都需要這個jar包在classpath中。

當我們用maven install生成最終的構件包ProjectABC.war後,在其下的WEB-INF/lib中,會包含我們被標註爲scope=compile的構件的jar包,而不會包含我們被標註爲scope=provided的構件的jar包。這也避免了此類構件當部署到目標容器後產生包依賴衝突。

scope=provided

scope=provided的情況,則可以認爲這個provided是目標容器已經provide這個jar。換句話說,它隻影響到編譯,測試階段。在編譯測試階段,我們需要這個app對應的jar包在classpath中,而在運行階段,假定目標的容器(比如我們這裏的tomcat容器)已經提供了這個jar包,所以無需我們打包對應的jar包了。在運行階段,app可以直接使用容器提供的jar。

scope=import

解決maven繼承(單)問題

我們知道Maven的繼承和Java的繼承一樣,是無法實現多重繼承的,如果10個、20個甚至更多模塊繼承自同一個模塊,那麼按照我們之前的做法,這個父模塊的dependencyManagement會包含大量的依賴。如果你想把這些依賴分類以更清晰的管理,那就不可能了。
import scope依賴能解決這個問題。你可以把dependencyManagement放到單獨的專門用來管理依賴的pom中,然後在需要使用依賴的模塊中通過import scope依賴,就可以引入dependencyManagement。例如可以寫這樣一個用於依賴管理的pom:

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

<!--    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> lookup parent from repository
    </parent> -->

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement> 

    <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>26.0-jre</version>
        </dependency>
    </dependencies>

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