美文网首页程序员技术干货
maven实战总结:坐标与仓库

maven实战总结:坐标与仓库

作者: mecury | 来源:发表于2017-12-05 21:00 被阅读119次

    1.POM文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>homethy-whitepages-reptile</groupId>
        <artifactId>homethy-whitepages-reptile</artifactId>
        <version>1.0-SNAPSHOT</version>
    </project>
    

    modelVersion:POM 模型的版本

    groupId:项目属于哪个组,或哪个组与此有关联

    artifactId:定义了项目在Maven中唯一的ID

    version:版本号

    2.maven主要命令

    • mvn clean complie 编译主代码
    • mvn clean test 编译测试代码,在这之前会编译主代码, 测试资源处理,测试代码编译
    • mvn clean package 打包,默认为jar
    • mvn clean install 将jar安装到maven的本地仓库

    第五章 坐标与依赖

    1. 坐标详解

    ```
    <dependency>
        <groupId>com.homethy</groupId>
        <artifactId>homethy-crm-search-client</artifactId>
        <version>2.2.0</version>
        <packaging>jar</packaging>
    </dependency>
    ```
    
    • groupId 定义当前 Maven项目隶属的实际项目
    • artifactId 定义实际项目中的一个 Maven 项目
    • version 定义 Maven 项目所处的版本
    • packaging 定义 Maven的打包的测试,jar 或 war
    • classifier 定义构建输出的一些附属组建

    2. service.properties

    email.protocol = smtps
    email.host = smtp.gmail.com
    email.username = you-id@gmail.com
    email.password = your-password
    email.auth = true;
    eamol.systemEmail = your-id@juvenxu.com
    

    在pom.xml中的表现:

        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholder-Configure">
            <properties name="protocol" value="${email.protocol}"/>
            <properties name="host" value="${email.host}"/>
            ....
        </bean>
    
    

    3. 依赖的配置

    <project>
        ...
        <dependencies>
            <dependency>
                <groupId>...</groupId>
                <artifactId>...</artifactId>
                <version>...</version>
                <type>...</type>
                <scope>...</scope>
                <exclusions>
                    <exclusion>
                        ...
                    </exclusion>
                    ...
                </exclusions>
            </dependency>
    
            ...
        </dependencies>
        ...
    
    </project>
    
    • groupId, artifactId, version : 依赖的基本坐标
    • type : 依赖的类型,对应packaging
    • scope : 依赖的范围
    • optional : 标记依赖是否可选
    • exclusions : 用来排除传递性依赖

    4. 依赖范围 scope

    • compile : 编译依赖范围。如果没有指定,默认使用该依赖范围
    • test : 测试依赖范围, 只针对测试classpath有效,在编译主代码或者运行项目的使用时将无法使用该依赖
    • provided : 已提供依赖范围。使用此依赖,对于编译与测试 classpath 有效,但在运行时无效
    • runtime : 运行时依赖范围。对于测试和运行classpath有效,在编译主代码时无效
    • system : 系统依赖范围。和provided依赖范围完全一致。但必须通过systemPath元素显示地制定依赖文件的路径
    依赖范围(scope) 对于编译classpath有效 对于测试classpath有效 对于运行时classpath有效 例子
    compile Y Y Y spring-core
    test - Y - JUnit
    provided Y Y - servlet-api
    runtime - Y Y JDBC驱动
    system Y Y - 本地的,Maven仓库之外的类库文件

    5.传递性依赖
    项目依赖一个依赖,该依赖又依赖另外的依赖,该项目虽然直接依赖,但不要单独引入这些依赖。
    6.传递性依赖与依赖范围
    A-->B-->C
    A对于B时第一直接依赖
    B对于C时第二直接依赖
    A对于C时传递性依赖

    第一直接依赖\第二直接依赖 compile test provided runtime
    compile compile - - runtime
    test test - - test
    provided provided - provided provided
    runtime runtime - - runtime

    7. 依赖调解

    A-->B-->C-->X(1.0)

    A-->D-->X(2.0)

    第一原则:最短路径优先

    A-->B-->Y(1.0)

    • 可选依赖:可选依赖不被传递,在项目中显式声明
    • 排除依赖:<exclusions>
    • 归类依赖:使用统一的version来管理版本
        <!--使用<version>${springframework.version}</version>-->
        <properties>
            <springframework.version>2.5.6</springframework.version>
        </properties>
    
    • 优化依赖

    mvn dependency:list : 查看当前项目的依赖

    mvn dependency:tree :
    mvn dependency:analyze : 分析编译主代码需要用到的依赖

    第六章: 仓库

    Maven 的世界中,任何一个依赖、插件、或者项目的构建输出,都可以称为构件。Maven中统一存储这些所有Maven构件的地方,称为 Maven仓库

    1. 仓库的布局

    groupId/artifactId/artifactId-version.packaging

    实例:构件路径的生成:groupId=org.testng, artifactId=testng, version=5.8, classifier=jdk15, packageing=jar                             
    1\.基于groupId:org/testng  
    2\.基于artifactId: org/testng/testng  
    3\.使用版本信息:org/testng/testng/5.8  
    4\.使用连接符‘-’,artifactId-version  
    org/testng/testng/5.8/testng-5.8        
    5\.若有classifier  
    org/testng/testng/5.8/testng-5.8-jdk5   
    6\.检查构件的extension,它由packaging决定,生成的最终路径为  
    org/testng/testng/5.8/testng-5.8-jdk5.jar  
    

    2.仓库的分配

    • 本地仓库
    • 远程仓库:中央仓库,私服,其他仓库
    1. 中央仓库
      Maven必须知道至少一个中央仓库
    2. 私服
      特殊的中央仓库,部署在局域网的仓库服务。私服不存在该构件时,由外部的远程仓库下载。

    3.远程仓库的配置
    配置 POM 使用仓库

        <repositories>
            <repository>
                <id>jboss</id>
                <name>JBoss Repository</name>
                <url>http://repository.jboss.com/maven2/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    • repository : 声明一个远程仓库
      • id : 一个仓库的id,唯一
      • name : 仓库名称
      • url : 仓库地址
      • release : 控制对于发布版本构件的下载
        • enable : 开启仓库对于发布版本构件下载的支持
        • checksumPolicy : 控制校验文件的策略
          • warn : 默认,Maven在验证时输入警告信息
          • fail : 校验错误使构建失败
        • updatePolicy :
          • daily
          • never
          • always
          • interval : 跟时间,每个多少分钟更新一次
      • snapshots : 控制对于快照版本构件的下载支持
        • enable :
        • checksumPolicy :
        • updatePolicy :

    4.远程仓库的认证
    在setting.xml文件中配置仓库认证信息

    <servers>
        <server>
            <id>my-proj</id>
            <username>repo-user</username>
            <password>repo-pwd</password>
        </server>
    </servers>
    
    • server
      • id : 仓库定义时在 repository 中设置的 id
      • username
      • password

    5.部署至远程仓库

        <distributionManagement>
            <repository>
                <id>proj-release</id>
                <name>Proj Release Repository</name>
                <url>http://192.168.1.100/content/repositories/proj-releases</url>
            </repository>
            <snapshotRepository>
                <id>proj-snapshot</id>
                <name>Proj Snapshot Repository</name>
                <url>http://192.168.1.100/content/repositories/proj-snapshot</url>
            </snapshotRepository>
        </distributionManagement>
    
    

    mvn clean install 将构件部署到远程仓库

    • repository : 配置发布构件部署
    • snapshotRespository : 配置快照版本构件部署
    • id : 远程仓库的唯一id
    • name : 为了方便人阅读
    • url : 仓库地址

    6.快照版本
    快照版本在每次发布的时候Maven都会都会为其打上时间戳,在执行
    mvn clean install -U
    的时候,会从仓库中找到最新的快照版本

    7.从仓库中解析依赖的机制

    1. 当依赖的范围为system的时候,Maven 直接从本地系统中解析构件。
    2. 根据路径先由本地仓库寻找构件,存在则解析成功
    3. 若本地不存在相应的构件,依赖的版本又是发布版本构件,则遍历所有的远程仓库,发现后,解析并使用。
    4. 若依赖为RELEASELATEAST,则基于更新策略读取所有的远程仓库的元数据(groupId/artifactId/version/maven-metadata.xml),将其与本地仓库的对应元数据合并后,计算RELEASELATEAST的值, 基于这个值去检查本地与远程仓库
    5. 若依赖为snapshot,则基于更新策略读取所有的远程仓库的元数据(groupId/artifactId/version/maven-metadata.xml),将其与本地仓库的对应元数据合并后,得到快照的值,基于这个值检查本地与远程
    6. 如果最后解析的为时间戳格式的snapshot如:1.4.1-20091104,则复制其时间戳格式到非时间戳格式SNAPSHOT,并使用非时间戳的构件

    8. 镜像

    若仓库 X 能提供 仓库 Y 存储的所有内容,则称 X 为 Y 的镜像,合适的镜像往往速度更快。
    配置私服镜像settings.xml:

    <mirrors>
        <mirror>
            <id>internal-repository</id>
            <name>Internal Repository Manager</name>
            <url>http://192.168.1.100</url>
            <mirrorOf>*</mirrorOf>
        </mirror>
    </mirrors>
    
    • id : 仓库id, 唯一
    • name : 方便阅读
    • url : 仓库地址
    • mirrorOf
      • <mirrorOf> * </mirrorOf> : 匹配所有的仓库
      • <mirrorOf> external:*</mirrorOf> : 匹配所有仓库,使用localhost的除外,即排除本机
      • <mirrorOf> repo1, repo2 </mirrorOf> : 匹配仓库 repo1, repo2
      • <mirrorOf> *, !repo1 </mirrorOf> : 匹配所有仓库,repo1除外

    9.仓库的搜索服务

    • Sonartype Nexus
      提供结果共构件的坐标及其所属仓库
    • Jarvana
      提供浏览构件内部的内容
    • MVNbrowser
      显示构件依赖的构件
    • MVNrepository
      显示各个构件的版本变化

    相关文章

      网友评论

        本文标题:maven实战总结:坐标与仓库

        本文链接:https://www.haomeiwen.com/subject/mahhixtx.html