《Maven 实战》之仓库

1 简介

 在熟悉Maven的过程中,运行第一个Maven程序helloworld,默认会把下载的依赖存放到~/.m2/repository下。而该repository仓库为当前用户的本地仓库,仓库,即存放东西的地方。Maven仓库则是存放依赖的位置。在Maven的世界中,坐标和依赖是任何一个构件的逻辑标识方式,而构件的物理表示方式是文件,Maven通过仓库统一管理这些构件文件。
在项目中不使用Maven技术,会存在如下的问题:
在这里插入图片描述

2 何为仓库

 得益于坐标机制,任何Maven项目使用任何一个构建的方式都是完全相同的。因此,Maven可以在某一个位置上统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。实际的Maven项目不再各自存储其依赖文件,只是需要声明这些依赖的坐标,需要的时候(编译时将依赖加入classpath),Maven会自动根据坐标找到构件,并使用它们。为了实现重用,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。

3 仓库的布局

 任何一个构件都有坐标,可以根据坐标找到其在仓库中对应的位置。log4j:log4j:1.2.15这个依赖,对应的仓库路径为log4j/log4j/1.2.14/log4j-1.2.15.jar。大致遵循如下的形式

groupId/artifactId/version/artifactId-version.packaging

 参见Maven 仓库的布局

private static final char PATH_SEPARATOR = '/';

private static final char GROUP_SEPARATOR = '.';

private static final char ARTIFACT_SEPARATOR = '-';

public String pathOf( Artifact artifact )
{
    ArtifactHandler artifactHandler = artifact.getArtifactHandler();

    StringBuilder path = new StringBuilder( 128 );

    path.append( formatAsDirectory( artifact.getGroupId() ) ).append( PATH_SEPARATOR );
    path.append( artifact.getArtifactId() ).append( PATH_SEPARATOR );
    path.append( artifact.getBaseVersion() ).append( PATH_SEPARATOR );               path.append( artifact.getArtifactId() ).append( ARTIFACT_SEPARATOR ).append( artifact.getVersion() );


    if ( artifact.hasClassifier() )
    {
        path.append( ARTIFACT_SEPARATOR ).append( artifact.getClassifier() );
    }

    if ( artifactHandler.getExtension() != null && artifactHandler.getExtension().length() > 0 )
    {
        path.append( GROUP_SEPARATOR ).append( artifactHandler.getExtension() );
    }

    return path.toString();
}

private String formatAsDirectory( String directory )
{
    return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );
}  

 Maven仓库正是基于简单的文件系统来存储依赖的,当遇到与仓库相关的问题,可以方便的查找相关文件,方便定位问题。

4 仓库的分类

在这里插入图片描述

4.1 本地仓库

 默认位置~/.m2/repository

 但可以在settings.xml中通过标签指定。

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    
  <localRepository>C:\Users\lenovo\.m2\repository</localRepository>
  <mirrors>
    <mirror>
        <id>nexus</id>
        <mirrorOf> * </mirrorOf>
        <url>http://localhost:8081/repository/maven-central/</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>  
        <id>downloadSources</id>  
        <properties>  
            <downloadSources>true</downloadSources>  
            <downloadJavadocs>true</downloadJavadocs>             
        </properties>  
    </profile> 

  </profiles>
  
  <activeProfiles>  
    <activeProfile>downloadSources</activeProfile>  
  </activeProfiles> 


</settings>

 若硬要把本地的项目所输出的构件部署到本地仓库中,此时需要执行命令

mvn clean install

4.2 远程仓库

 理解远程仓库,许晓斌提出了一个很好的取类比象的方式,本地仓库、私服、远程仓库的关系就好比书房、书店和淘宝商城的关系一样。

4.2.1 中央仓库

 笔者当前的Maven版本为3.5.4

C:\Program Files\apache-maven-3.5.4>echo %MAVEN_HOME%
C:\Program Files\apache-maven-3.5.4

 在%MAVEN_HOME%\lib目录下存在jar包maven-model-builder-3.5.4.jar
在这里插入图片描述
 用好压的方式解压之后可以看到

C:\Program Files\apache-maven-3.5.4\lib\maven-model-builder-3.5.4\org\apache\maven\model

 存在文件pom-4.0.0.xml,包含这段配置的文件是所有Maven项目都会继承的超级POM。该文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!-- START SNIPPET: superpom -->
<project>
  <modelVersion>4.0.0</modelVersion>

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

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>

  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>

      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>

      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
<!-- END SNIPPET: superpom -->

 其中定义了所有Maven项目默认的中央仓库

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

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

4.2.2 私服

 私服是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内用户使用。组织内部使用私服具有如下的好处:
在这里插入图片描述
 本地仓库、私服与中央仓库的关系如下图所示:
在这里插入图片描述

4.2.3 远程仓库

4.2.3.1 配置项目从多个仓库下载jar

 配置项目从多个仓库下载jar包,应该把要把仓库的位置信息指定在项目的POM中。
在很多情况下,默认的中央仓库无法满足项目的要求,可能项目需要的构件存在另外一个远程仓库中,可以在POM中配置该仓库。

<repositories>
    <repository>
        <!-- Maven 自带的中央仓库使用的Id为central 如果其他的仓库声明也是用该Id
        就会覆盖中央仓库的配置 --> 
      <id>mvnrepository</id>
        <name>mvnrepository</name>
        <url>http://www.mvnrepository.com/</url>
        <layout>default</layout>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

 在POM中配置仓库,注意如下的属性:
在这里插入图片描述

注意:另外一种方式则是在settings.xml的中配置仓库信息,这样就是对所有项目均生效了。是一种全局配置

4.2.3.2 远程仓库认证

 大部分远程仓库无需认证就可以访问,但是有时候需要提供认证信息才能访问一些远程仓库。比如在把项目的输出部署到私服时,需要添加私服的认证信息。配置认证信息和配置仓库信息不同,仓库信息可以直接部署在POM文件中,但是认证信息必须配置在settings.xml中,这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本地,因此在settings.xml中配置认证信息更加安全。
在这里插入图片描述

注意:settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致,换句话说,正是这个id将认证信息和仓库配置信息联系在了一起

4.2.3.3 部署至远程仓库

 由于每个项目要部署的远程仓库可能不同,因此把药部署的仓库信息配置在settings.xml中是不正确的做法。私服的一大作用就是部署第三方构件,包括组织内部生成的构建以及一些无法从外部仓库直接获取的构件。在POM中配置distrubutionManagement元素可以实现部署构件到远程仓库的目的
参见在pom.xml中使用distributionManagement将项目打包上传到nexus私服
maven 中 部署构件至Nexus(mvn deploy)
首先在POM中添加类似如下的信息

<distributionManagement>  
        <repository>  
            <id>releases</id>  
            <name>Local Nexus Repository</name>  
            <url>http://127.0.0.1:8081/nexus/content/repositories/releases/</url>  
        </repository>  
        <snapshotRepository>  
            <id>Snapshots</id>  
            <name>Local Nexus Repository</name>  
            <url>http://127.0.0.1:8081/nexus/content/repositories/snapshots</url>  
        </snapshotRepository>  
</distributionManagement> 

 往远程仓库部署构件的时候,往往需要认证。配置认证的方式如前所述,在settings.xml中创建server元素,其id与仓库的id匹配,并配置正确的认证信息即可,类似的认证信息如下:

<servers><server>  
    <id>releases</id>  
    <username>admin</username>  
    <password>123admin</password>  
    </server>  
    <server>  
    <id>Snapshots</id>  
    <username>admin</username>  
    <password>123admin</password>  
    </server>   
 </servers>

执行命令

mvn clean deploy

即可。

5 快照版本

 Maven快照版本机制是为了解决开发过程中尚不稳定的版本引用的问题。如果把模块的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布的过程中,Maven会自动为构件打上时间戳。

2.1-20091214.221414-13表示20091214221414秒的13次构建

 有了该时间戳,Maven就能随时找到仓库中该构件2.1-SNAPSHOT版本最新的文件。
需要注意的是,快照版本只应该在组织内部或模块间依赖使用,因为这时,组织对于这些快照版本的依赖具有完全的理解和控制权。项目不应该依赖任何组织外部的快照版本依赖,由于快照版本的不稳定性,这样的依赖往往会造成潜在的问题。

6 从仓库解析依赖的机制

 当本地仓库没有依赖构件的时候,Maven会自动从远程仓库下载;当依赖版本为快照版本的时候,Maven会自动找到最新的快照。这背后的依赖解析机制可以概括如下:

  1. 当依赖的范围是system的时候,Maven直接从本地文件系统解析构件。
  2. 根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功。
  3. 在本地仓库不存在相应构件的情况下,如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST真实的值,然后基于这个真实的值检查本地和远程仓库,如步骤2和3。
  4. 如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。
  5. 如果最后解析得到的构建版本是时间戳格式的快照,如1.4.1-20091104.121450-121,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构件。
    参见Maven从仓库解析并使用依赖构建的机制

注意:在依赖声明中使用LATEST和RELEASE是不推荐的做法,因为Maven随时可能会解析到不同的构件。

 具体理解参见第8部分实例。

7 镜像

 如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。镜像的设置位于settings.xml
在这里插入图片描述
 的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像。类似的,如果镜像需要认证,也可以基于该id配置仓库认证。
镜像的一个更为常用的用法是结合私服,由于私服可以代理任何外部的公共仓库(包括中央仓库),因此,对于组织内部的Maven用户来说,使用一个私服地址就相当于使用了所有的外部仓库,这可以将配置集中到私服,从而简化Maven本身的配置。在这种情况下,任何需要的构件都可以从私服获得,私服就是所有仓库的镜像。

<mirrors>
	<mirror>
		<id>nexus</id>
		<name>nexus maven</name>
		<url>http://localhost:8081/repository/maven-central/</url>
		<mirrorOf>*</mirrorOf>
	</mirror>
  </mirrors>

 其中*表示匹配所有的远程仓库。

8 实例

8.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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.example</groupId>
    <artifactId>profile</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>profile</name>
    <packaging>jar</packaging>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>nexus</id>
            <name>Nexus3</name>
            <url>http://localhost:8081/repository/maven-central/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>


    <distributionManagement>
        <repository>
            <id>nexus-release</id>
            <name>Local Nexus Repository</name>
            <url>http://localhost:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshot</id>
            <name>Local Nexus Repository</name>
            <url>http://localhost:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

    <properties>
        <java.version>1.8</java.version>
    </properties>

8.2 settings.xml

<?xml version="1.0" encoding="UTF-8"?>


<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <localRepository>D:\repository</localRepository>
  <mirrors>
   <mirror>
      <id>nexus</id>
      <name>nexus maven</name>
      <url>http://localhost:8081/repository/maven-central/</url>
      <mirrorOf>central</mirrorOf>
   </mirror>
  </mirrors>
  <servers>
   <server>
      <id>nexus</id>
      <username>admin</username>
      <password>admin123</password>
   </server>
   <server>
      <id>nexus-release</id>
      <username>admin</username>
      <password>admin123</password>
   </server>
   <server>
      <id>nexus-snapshot</id>
      <username>admin</username>
      <password>admin123</password>
   </server>
  </servers>
</settings>

8.3 执行命令mvn clean deploy

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" -Dmaven.multiModuleProjectDirectory=D:\Git\profile -Dmaven.home=C:\apache-maven-3.5.4 -Dclassworlds.conf=C:\apache-maven-3.5.4\bin\m2.conf "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1.5\lib\idea_rt.jar=51303:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1.5\bin" -Dfile.encoding=UTF-8 -classpath C:\apache-maven-3.5.4\boot\plexus-classworlds-2.5.2.jar org.codehaus.classworlds.Launcher -Didea.version=2018.1.5 -s C:\Users\lenovo\.m2\settings.xml deploy -f pom.xml
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------< com.example:profile >-------------------------
[INFO] Building profile 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ profile ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ profile ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to D:\Git\profile\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ profile ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\Git\profile\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ profile ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ profile ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ profile ---
[INFO] Building jar: D:\Git\profile\target\profile-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ profile ---
[INFO] Installing D:\Git\profile\target\profile-1.0-SNAPSHOT.jar to D:\repository\com\example\profile\1.0-SNAPSHOT\profile-1.0-SNAPSHOT.jar
[INFO] Installing D:\Git\profile\pom.xml to D:\repository\com\example\profile\1.0-SNAPSHOT\profile-1.0-SNAPSHOT.pom
[INFO] 
[INFO] --- maven-deploy-plugin:2.8.2:deploy (default-deploy) @ profile ---
Downloading from nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.jar
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.jar (5.5 kB at 25 kB/s)
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.pom
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.pom (2.1 kB at 20 kB/s)
Downloading from nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/maven-metadata.xml
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml (762 B at 6.9 kB/s)
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/maven-metadata.xml
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/maven-metadata.xml (276 B at 3.0 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.613 s
[INFO] Finished at: 2018-03-13T10:44:30+08:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

从上述终端打印中,可以看到如下的信息:

Downloading from nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.jar
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.jar (5.5 kB at 25 kB/s)
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.pom
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.pom (2.1 kB at 20 kB/s)
Downloading from nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/maven-metadata.xml
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml (762 B at 6.9 kB/s)
Uploading to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/maven-metadata.xml
Uploaded to nexus-snapshot: http://localhost:8081/repository/maven-snapshots/com/example/profile/maven-metadata.xml (276 B at 3.0 kB/s)
从私服的快照仓库下载maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml
上传jar包maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.jar
上传pom maven-snapshots/com/example/profile/1.0-SNAPSHOT/profile-1.0-20180313.024430-1.pom
下载maven-metadata.xml  maven-snapshots/com/example/profile/maven-metadata.xml
上传maven-metadata.xml  maven-snapshots/com/example/profile/1.0-SNAPSHOT/maven-metadata.xml
上传maven-metada.xml    maven-snapshots/com/example/profile/maven-metadata.xml

在这里插入图片描述
以HTML形式查看profile在私服中的构件
在这里插入图片描述
 回顾RELEASE和LATEST版本,它们分别对应了仓库中存在的该构件的最新发布版本和最新版本(包括快照),而这个最新是基于groupId/artifactId/maven-metadata.xml计算出来的。可在浏览器中查看,比如说查看profile的maven-metadata.xml,内容如下:

http://localhost:8081/repository/maven-releases/com/example/profile/maven-metadata.xml

查看入口为:
在这里插入图片描述
在这里插入图片描述
 此处查看maven-releases仓库
在这里插入图片描述
 在浏览器中可以查看maven-metadata.xml,可以查看到如下的内容
在这里插入图片描述
 该文件列出了仓库中存在的该构件所有可用的版本,release元素指向了这些版本中最新的发布版本。
 Maven通过合并多个远程仓库及本地仓库的元数据,就能计算出基于所有仓库的latest和release分别是什么,然后再具体解析具体的构件。
 在本地仓库对应的文件系统中查看基于groupId和artifactId的maven-metadata-local.xml
在这里插入图片描述
具体内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.example</groupId>
  <artifactId>profile</artifactId>
  <versioning>
    <release>1.2</release>
    <versions>
      <version>1.0-SNAPSHOT</version>
      <version>1.0</version>
      <version>1.1</version>
      <version>1.2</version>
      <version>1.2-SNAPSHOT</version>
      <version>1.3-SNAPSHOT</version>
    </versions>
    <lastUpdated>20180313033031</lastUpdated>
  </versioning>
</metadata>

 当依赖的版本设为快照版本的时候,Maven也需要检查更新,这时,Maven会检查仓库元数据groupId/artifactId/version/maven-metadata.xml,
在这里插入图片描述
从上图可以看到1.3-SNAPSHOT目录下,为两次构建生成了对应的目录。查看1.3-SNAPSHOT目录下的maven-metadata.xml,可以看到如下的内容:

8.4 源码下载

GitHub地址

9 总结

 文档详细介绍了Maven仓库的含义,布局,以及仓库分类,尤其在对远程仓库的配置时详细的演示了POM中配置下载构件的仓库,setting.xml配置仓库认证信息,以及POM中配置要部署项目输出构件的仓库信息的方式。文档也详细的阐述了快照版本的含义和依赖解析的机制。最后则是对私服与镜像结合的用法进行解释。文档的第8部分为案例下载,通过源码可以理解POM、settings.xml的配置方式。并且源码演示了Spring Boot多profile的使用。通过结合案例和私服阐述了依赖具体解析的过程。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值