maven技术干货coder相关工具

maven---6仓库

2016-11-20  本文已影响2035人  zlcook

|-1-更新内容[6.从仓库解析依赖的机制(重要)]

1Maven仓库作用

仓库用来存储所有项目使用到构件,在maven项目需要依赖时就从该仓库中获取需要的依赖添加到classpath供其使用。

1.1需求背景

2Maven仓库布局

2.1布局规则

2.2本地仓库中依赖文件夹中其它文件解释

log4j-1.2.15.jar在本地仓库存储路径

log4j-1.2.15.pom:log4j-1.2.15.jar依赖的pom文件,该文件在log4j-1.2.15.jar文件解压后也能得到,只是名称为pom.xml。
_remote.repositories:该文件所在的远程仓库信息。
log4j-1.2.15.jar.sha1:log4j-1.2.15.jar文件的校验和文件,log4j-1.2.15.jar文件下载后为了验证下载内容是否完整,需要使用log4j-1.2.15.jar.sha1中的校验和值来比对。如果下载内容不完整(网络原因等)maven会作出相应通知。(下面远程仓库配置有讲解)
log4j-1.2.15.pom.sha1:log4j-1.2.15.pom的校验和文件。

3仓库的分类

3.1介绍

maven仓库的分类

3.2本地仓库

3.2.1本地仓库位置

3.2.2修改本地仓库位置

3.2.2三种方式添加构件到本地仓库

3.2.2.1从远程仓库下载下来。

通过在项目的pom中配置依赖,dependency下载需要的依赖到本地仓库。

3.2.2.2 通过maven命令安装maven项目到本体仓库

3.2.2.3安装第三方构件到本地仓库

关于部署第三方构件到Nexus私服仓库,请查看maven---9使用Nexus创建私服----->5.3手动部署第三方构件至Nexus

3.3远程仓库

3.4中央仓库

<repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

3.5私服

3.5.1架设私服的好处

4远程仓库配置(包含更新策略)

4.1配置

默认的中央仓库无法满足项目需求,可能需要的构件在另外一个远程仓库,如JBoss Maven仓库,可以POM中配置该仓库。

<repositories>
....
    <repository>
      <id>jboss</id>
      <name>JBoss Repository</name>
      <url>https://repository.jboss.com/maven2/</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
     <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
 ....
  </repositories>

4.1.1解释

 <releases>
        <enabled>true</enabled>
        <updataPolicy>daily</updataPolicy>
        <checksumPolicy>warn</checksumPolicy>
    </releases>

4.2远程仓库的认证

<settings>
...
   <servers>
    <server>  
          <id>my-proj</id>  
          <username>repo-user</username>  
          <password>repo-pwd</password>  
       </server>  
   </servers>
...
</settings>

4.3部署当前maven项目至远程仓库

4.3.1需求

4.3.2操作步骤

步骤-1配置pom.xml
需要编写pom.xml文件,配置distributionManagement元素。

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

步骤-2配置settings.xml

步骤-3使用部署命令

5快照版本

任何一个项目或者构件都必须由自己的版本,1.0.0、1.2-alpha-4、2.0、2.1-SNAPSHOT,其中2.1-SNAPSHOT是不稳定的快照版本。

5.1需求

小张和李MM负责公司同一个项目的不同模块,小张负责A模块,李MM负责B模块,但是B模块的开发过程中依赖A模块,为了保证快速开发,小张的模块A内容的变化应该尽快的让李MM获取到,但是李MM获取小张模块A是通过groupId、artifactId、version来配置获取的,怎样才能获取最新的呢?两人不停的改变版本号? 那么小张和李MM怎么配合开发呢?

5.2方案

5.3使用经验

6从仓库解析依赖的机制(重要)

上一节介绍了Maven依赖机制,本章阐述了Maven仓库,这两者是如何具体联系到一起的呢?Maven是根据怎样的规则从仓库解析并使用依赖构件的呢?

6.1解析构件步骤

该步骤适用于插件、依赖的解析

  1. 当依赖范围是system时候,Maven直接从本地文件解析构件。
  2. 根据依赖坐标计算仓库路径后,先从本地仓库寻找构件,如果发现则解析成功。
  3. 本地仓库没找到,如果依赖版本(version)是发布版构件,即1.2,2.3等,则遍历远程仓库,发现后下载并解析使用。
  4. 如果version是SNAPSHOT版,如:2.1-SNAPSHOT,则基于更新策略(updatepolicy)读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。(如果最新版还是之前的值就不需要去远程仓库下载了)。
    注意:这一步因为updatepolicy的原因,可能要求本机能连接到远程仓库(远程仓库可以是私服或者中央仓库,一般只有自己的项目会使用SNAPSHOT,所以大多数是私服)
  5. 如果最后解析得到构件版本是时间戳格式的快照,如1.4.1-20161121.121432-121则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该时间戳格式的构件。
  6. 当依赖的version值为RELEASE时(不建议),Maven会基于updatepolicy策略读取远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库相对应元数据合并后,计算出最新版本的RELEASE值(稳定版),然后基于这个值检查本地和远程仓库,步骤如2和3。
    注意:存在潜在问题,如某个依赖的1.1版本与1.2版本可能发生一些接口变化,从而导致当前Maven项目构建失败,所以依赖的版本最好确定

注:第4步骤在6.2、6.3节有详解

6.2解析进一步说明

6.3 快照版和稳定版解析构件详解

6.3.1解析时机

6.3.2解析说明

6.3.3步骤1:获取构件版本值

6.3.4步骤2:获取构件版本值

当构件version=RELEASE情况(不建议这么设值)
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0">
  <groupId>net.sourceforge.nekohtml</groupId>
  <artifactId>nekohtml</artifactId>
  <version>1.9.22</version>
  <versioning>
    <latest>1.9.22</latest>
    <release>1.9.22</release>
    <versions>
      <version>1.9.7</version>
      <version>1.9.8</version>
     。。。。。省略其它版本
      <version>1.9.21</version>
      <version>1.9.22</version>
    </versions>
    <lastUpdated>20150417210244</lastUpdated>
  </versioning>
</metadata>
当构件version为快照版情况
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0">
  <groupId>com.cnu.iqas</groupId>
  <artifactId>iqasweb</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20170111.062153</timestamp>
      <buildNumber>4</buildNumber>
    </snapshot>
    <lastUpdated>20170111062153</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>war</extension>
        <value>0.0.1-20170111.062153-4</value>
        <updated>20170111062153</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>0.0.1-20170111.062153-4</value>
        <updated>20170111062153</updated>
      </snapshotVersion>
      <snapshotVersion>
        <classifier>sources</classifier>
        <extension>jar</extension>
        <value>0.0.1-20170111.062153-4</value>
        <updated>20170111062153</updated>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>
iqasweb快照版构件

6.4常见解析失败

在根据6.1的执行步骤解析构件时难免因为一些出现一些错误,常见一个错误如下:

<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java</artifactId>
    <version>3.0.4</version>
</dependency>

第一次解析上面依赖因为没网络执行到第3步失败:


解析步骤和失败原因

失败后在本地仓库产生的文件如下:

解析失败产生的文件

docker-java-3.0.4.jar.lastUpdated文件的内容如下:

#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
#Mon Jan 09 21:21:29 CST 2017
http\://172.19.201.155\:8081/repository/maven-public/.lastUpdated=1483968089340
http\://172.19.201.155\:8081/repository/maven-public/.error=

执行命令加上-U参数,或者将解析失败构件在本地仓库中的xxxx.lastupdated文件删掉,就不会返回缓存了。

下载新构件

7镜像

<settings>
  <mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |  -->
    <mirror>
      <id>maven.net.cn</id>
      <name>one of the central mirrors in China</name>
      <url>http://maven.net.cn/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
</settings>

8仓库搜索服务

我们如何寻找需要的依赖,以下是几个公共Maven仓库搜索服务,都代理了主流的Maven公共仓库,如中央仓库、JBoss、java.net等,搜索关键字有:类名、坐标、校验和搜索等

8.1Sonatype Nexus

Sonatype Nexus

8.2Jarvana

Jarvana

8.3MVNborwser

MVNborwser

8.4MVNrepository

MVNrepository

有什么不懂的一起探讨一下吧,我也是在学习的路上。喜欢给我点个赞吧(哈哈),我会继续努力的。

上一篇 下一篇

猜你喜欢

热点阅读