通过 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 命令。如果需要搜索某个构件,需要访问仓库来执行搜索操作。