「Maven」- 概念术语:仓库(Repository)

通过 Maven 管理,项目的所有依赖都将从仓库中获取,而无需在各个项目中单独保存;

仓库结构

Maven2 Repository Layout

Maven – Maven2 Repository Layout

Repository root
`-- ${groupId as directory}/
    |-- maven-metadata.xml
    |--                   .${checksums}
    `-- ${artifactId}/
        |-- maven-metadata.xml
        |--                   .${checksums}
        `-- ${version}/
            |-- ${artifactId}-${version}.pom
            |--                             .asc
            |--                             .${checksums}
            |-- ${artifactId}-${version}.${extension}
            |--                                     .asc
            |--                                     .${checksums}
            |-- ${artifactId}-${version}-${classifier}.${extension}
            |--                                                    .asc
            `--                                                    .${checksums}

仓库类型

本地仓库:$HOME/.m2/repository/
远程仓库:提供 Maven 构建的仓库;
中央仓库:Maven 官方仓库,https://repo.maven.org/maven2/%EF%BC%9B%E5%85%B6%E4%B9%9F%E5%B1%9E%E4%BA%8E%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%EF%BC%9B
私服仓库:自行搭建的的 Maven 仓库,用于组织内部使用。其也属于远程仓库;

远程仓库

添加远程仓库:

<project>
  ...
  <repositories>
    <repository>
      <id>my-internal-site</id>
      <url>https://myserver/repo</url>
      <releases>
        <enable>true</enable>
      </release>
      <snapshots>
        <enable>true</enable>
      </snaphots>
    </repository>
  </repositories>
  ...
</project>

该例配置中的 releases 和 snapshots 元素比较重要,它们用来控制 Maven 对于发布版构件和快照版构件的下载。这里需要注意的是 enabled 子元素,该例中 releases 的 enabled 值为 tue,表示开启仓库的发布版本下载支持,而 snapshots 的 enabled 值为 false,表示关闭仓库的快照版本的下载支持。因此,根据该配置,Maven 只会从 JBoss 仓库下载发布版的构件,而不会下载快照版的构件;

早期 Maven 仓库采用不同的目录结构,需要 layout 指定仓库的布局。default 表示是 Maven 2 及 Maven 3 的默认布局,而不是 Maven 1 的布局;

releases / snapshots,还包含 updatePolicy checkshumPolicy 属性,用于控制拉取行为;

仓库认证

针对部分远程仓库,其可能含有认证要求,这需要修改 settings.xml 并添加认证信息即可;

settings.xml

<settings>
  .
  .
  <servers>
    <server>
      <id>repo1</id>                                        // 需要与 pom.xml 中的 repository.id 对应;  
      <username>repouser</username>
      <!-- other optional elements:
        <password>my_login_password</password>
        <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
        <passphrase>my_key_passphrase</passphrase>
      -->
    </server>
  </servers>
  .
  .
</settings>

<server>
  <id>myrepo</id> 
  <username>deployer</username>
  <password>123456</password>
</server>

发布构件到仓库

pom.xml

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <distributionManagement>
    <repository>
      <uniqueVersion>false</uniqueVersion>
      <id>corp1</id>
      <name>Corporate Repository</name>
      <url>scp://repo/maven2</url>
      <layout>default</layout>
    </repository>
    <snapshotRepository>
      <uniqueVersion>true</uniqueVersion>
      <id>propSnap</id>
      <name>Propellors Snapshots</name>
      <url>sftp://propellers.net/maven</url>
      <layout>legacy</layout>
    </snapshotRepository>
    ...
  </distributionManagement>
  ...
</project>

如果仓库要求认证,依旧需要修改 settings.xml 文件,增加相同 id 的密码配置;

然后,执行发布命令:mvn deploy

镜像仓库

针对特定仓库的访问,都将被转化为对特定仓库的访问;

针对 central 访问,将被转化为 other-mirror 仓库。

<settings>
  ...
  <mirrors>
    <mirror>
      <id>other-mirror</id>
      <name>Other Mirror Repository</name>
      <url>https://other-mirror.repo.other-company.com/maven2</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
  ...
</settings>

仓库搜索

mvn 本身并不支持 Search 命令。如果需要搜索某个构件,需要访问仓库来执行搜索操作。