maven实战总结:坐标与仓库

1.POM文件



    4.0.0
    homethy-whitepages-reptile
    homethy-whitepages-reptile
    1.0-SNAPSHOT

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. 坐标详解

```

    com.homethy
    homethy-crm-search-client
    2.2.0
    jar

```
  • groupId 定义当前 Maven项目隶属的实际项目
  • artifactId 定义实际项目中的一个 Maven 项目
  • version 定义 Maven 项目所处的版本
  • packaging 定义 Maven的打包的测试,jar 或 war
  • classifier 定义构建输出的一些附属组建

2. service.properties

email.protocol = smtps
email.host = smtp.gmail.com
email.username = [email protected]
email.password = your-password
email.auth = true;
eamol.systemEmail = [email protected]

在pom.xml中的表现:

    
        
        
        ....
    

3. 依赖的配置


    ...
    
        
            ...
            ...
            ...
            ...
            ...
            
                
                    ...
                
                ...
            
        

        ...
    
    ...


  • 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)

  • 可选依赖:可选依赖不被传递,在项目中显式声明
  • 排除依赖:
  • 归类依赖:使用统一的version来管理版本
    
    
        2.5.6
    
  • 优化依赖

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 使用仓库

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

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


    
        my-proj
        repo-user
        repo-pwd
    

  • server
    • id : 仓库定义时在 repository 中设置的 id
    • username
    • password

5.部署至远程仓库

    
        
            proj-release
            Proj Release Repository
            http://192.168.1.100/content/repositories/proj-releases
        
        
            proj-snapshot
            Proj Snapshot Repository
            http://192.168.1.100/content/repositories/proj-snapshot
        
    

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:


    
        internal-repository
        Internal Repository Manager
        http://192.168.1.100
        *
    

  • id : 仓库id, 唯一
  • name : 方便阅读
  • url : 仓库地址
  • mirrorOf
    • * : 匹配所有的仓库
    • external:* : 匹配所有仓库,使用localhost的除外,即排除本机
    • repo1, repo2 : 匹配仓库 repo1, repo2
    • *, !repo1 : 匹配所有仓库,repo1除外

9.仓库的搜索服务

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

你可能感兴趣的:(maven实战总结:坐标与仓库)