maven细节讲解

一.坐标详解

先来一下段maven依赖:

<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.22</version>
<type>jar</type>
<scope>compile</scope>

groupId:定义当前Maven 项目隶属的实际项目。
artifactId:该元素定义实际项目中的一个Maven 项目(模块),推荐的做法是使用实际项目名称作为artifactId 的前缀。
version:该元素定义Maven 项目当前所处的版本。
type:包的后缀名。
scop:在哪里用到这个包,也就是作用域。compile表示在整个工程都会用到,默认就是这个。test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

二.排除依赖

大家都知道,在我们添加一个jar包之后,然后以maven install运行时,会将所有与之依赖的包都导入项目中,如果有些包我们不需要甚至对我们的项目有影响就需要解除依赖。如下:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook</groupId>
    <artifactId>project-a</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>com.juvenxu.mvnbook</groupId>
            <artifactId>project-b</artifactId>
            <version>1.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.juvenxu.mvnbook</groupId>
                    <artifactId>project-c</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.juvenxu.mvnbook</groupId>
            <artifactId>project-c</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>
</project>

上述代码中,项目A 依赖于项目B,但是由于一些原因,不想引入传递性依赖C,而是自己显式地声明对于项目C 1.1.0 版本的依赖。代码中使用exclusions 元素声明排除依赖,exclusions 可以包含一个或者多个exclusion 子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusion 的时候只需要groupId 和artifactId,而不需version元素,这是因为只需要groupId 和artifactId 就能唯一定位依赖图中的某个依赖,换句话说,Maven 解析后的依赖中,不可能出现groupId 和artifactId 相同,但是version不同的两个依赖。

三.依赖调解

第一原则是:路径最近者优先。如:A->B->C->X(1.0)、A->D->X(2.0),会依赖2.0
第二原则是:第一声明者优先。A->B->Y(1.0)、A->C->Y(2.0),若B在C之前声明,会依赖1.0
第三原则是:可选依赖不被传递。例如一个工程A实现了支持多种数据库,此时该工程的jar依赖要添加依赖范围<optional>true</optional>,当另一个工程B依赖这个工程时就需要显示的依赖是哪种数据库驱动。那么就可以让A工程专注于对接各种数据库的开发,而工程B根据实际情况来选择使用哪种数据库。例如:

工程A:
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook</groupId>
    <artifactId>project-a</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>8.4-701.jdbc3</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>
工程B:
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>com.juvenxu.mvnbook</groupId>
            <artifactId>project-a</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
        </dependency>
    </dependencies>
</project>

四.归类依赖

方便版本号统一替换,例如:

<properties>
    <springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${springframework.version}</version>
    </dependency>
<dependencies>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值