maven实战总结:坐标与仓库

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
    显示各个构件的版本变化
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • |-1-更新内容[6.从仓库解析依赖的机制(重要)] 1Maven仓库作用 仓库用来存储所有项目使用到构件,在ma...
    zlcook阅读 6,018评论 0 25
  • 目前在看nexus私服章节的知识时需要用到仓库与镜像的知识,正好通过简书把仓库和镜像章节的笔记整理一下 仓库 ma...
    小炼君阅读 1,267评论 0 48
  • Maven简单介绍 Maven是一个项目管理工具。强大,但是很容易使用。 它包含了: 一个项目对象模型 (Proj...
    高公子Daniel阅读 4,218评论 4 60
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 当前,JVM生态圈主要的三大构建工具: Apache Ant(带着Ivy) Maven Gradle 对于刚开始接...
    清枫_小天阅读 5,774评论 1 13