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