[TOC]
仓库用来存储所有项目使用到构件,在maven项目需要依赖时就从该仓库中获取需要的依赖添加到classpath供其使用。
maven项目不再各自存储其依赖文件,它们只需要声明这些依赖的坐标,在需要的时候(例如,编译项目的时候需要将依赖加入到classpath中),Maven会自动根据坐标到仓库中找构件,并使用它们。
仓库分为两种,远程仓库和本地仓库,maven根据坐标寻找构件时,会先在本地仓库查找,本地找不到会到远程仓库查找,找到后会下载到本地仓库,如果本地和远程仓库都找不到就会报错。
修改本地仓库地址:setting.xml文件
<localRepository>D:\repository</localRepository>
添加构件到本地仓库
mvn install:install-file -Dfile=g:\edu.mit.jwi_2.3.3_jdk.jar -DgroupId=local.edu.stanford -DartifactId=edu.mit.jwi_jdk -Dversion=2.3.3 -Dpackaging=jar -DpomFile=g:\pom.xml
<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>
使用id=central对仓库进行唯一标识;name仓库名称;url仓库地址;layout=default指定仓库的布局规则;enabled=false表示不从该中央仓库下载快照版本的构件。
架设私服的好处:
节省资金的外网带宽,利用私服代理外部仓库之后,对外的重复构件下载便得以下手,降低外网带宽压力。
加速Maven构建。不停地连接请求外部仓库是什么耗时的,但是maven的一些内部机制(如快照更新检查)要求Maven在执行构建的时候不停地检查远程仓库数据。因此,当项目配置了很多外部远程仓库的时候,构建速度会降低。使用私服解决这问题,因为Maven只需要检查局域网内私服的数据时,构建速度便提高。
部署第三方构件,当某个构件无法从任何一个远程仓库获取怎么办?比如Oracle的JDBC驱动由于版权原因不能发布到公共仓库中。建立私服后,便可以将这些构件部署到这个内部仓库中,供内部Maven项目使用。
提高稳定性,增强控制。对于远程仓库当外网不可用时,maven构建有可能因为依赖没有下载而不可行,私服后,即使没有网,如果该构件只有之前被其它人下载过就会存在私服上,此时我下时就可以不用连接外网直接就可以从私服上下载到。同时私服软件(nexus)还提供了额外的管理功能。
降低中央仓库的负荷。
https://help.aliyun.com/document_detail/102512.html
<repositories>
<repository>
<id>alipublic</id>
<name>aliyun public</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updataPolicy>daily</updataPolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updataPolicy>daily</updataPolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</repository>
</repositories>
updataPolicy:配置maven从远程仓库检查更新的频率,对同一个版本(如:log4j.1.2.15.jar)的构件如果发现有更新(如:对log4j.1.2.15.jar进行了内容修复但是版本都不变)会下载最新的。默认daily-maven每天检查一次
never-从不检查;always-每次构件都要检查更新;interval:X -每隔X分钟检查一次更新(X为整数)
当然:用户可以使用参数-U,强制检查更新,使用参数后,maven就会忽略updatePolicy的配置。
checksumPolicy:用来配置Maven检查校验和文件失败后的策略。构件被部署到maven仓库中时会同时部署对应的校验和文件,maven会验证校验和文件以确定下载的构件是否完整,如果校验失败,怎么办?策略有3中:(默认值)warn-maven会执行构建时输出警告信息;fail-maven遇到校验和错处就让构建失败;ignore-使maven完全忽略校验和错误。
有时候处于安全考虑,需要提供认证信息才能访问一些远程仓库。为了能让maven访问仓库内容,就需要配置认证信息,认证信息的配置不会在pom.xml配置,而是在settings.xml中配置,因为pom会被提交到代码仓库中供所有成员访问,而settings.xml一般只放在本机。
假设我在pom.xml中配置id=my-proj的远程仓库,需要认证信息,则在settings.xml中配置如下:
<settings>
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
</settings>
<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>
快照版只应该在公司内部项目使用,因为项目成员对不同的模块有清晰的理解和控制。项目不应该依赖第三方的快照版构件。那样存在不受控制和不稳定性。
将模块A的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布过程中maven会自动为构件打上时间戳,比如2.1-20191119-105936-12:表示2019年11月19号10点59分36秒第12次修改,有了该时间戳,Maven就能随时找到该仓库中该构件2.1-SNAPSHOT的最新构件。也就是2.1-SNAPSHOT对应了许多带有不同时间戳的构件。
配置对于模块A的2.1-SNAPSHOT版本,当构建模块B时发现有更新便进行下载,默认情况下,maven每天检查一次更新(由仓库配置的updataPolicy控制,上面有讲),也可以使用命令行-U参数强制maven更新,如:mvn clean install-U。
基于快照机制,就不用不断的修改版本.
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。举个栗子:http://maven.net.cn/content/groups/public/ 是中央仓库http://repol.maven.org/maven2/ 在中国的镜像,由于地理位置原因,该镜像提供的下载服务更快。因此可以配置maven使用该镜像来替代中央仓库,编辑settings.xml。
<settings>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
mirrorOf为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像
<mirrorOf>*</mirrorOf> :匹配所有远程仓库。
<mirrorOf>external:*</mirrorOf> :匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。
<mirrorOf>repo1,repo2</mirrorOf> :匹配仓库repo1,repo2,多个使用逗号分隔。
<mirrorOf>*,!repo1</mirrorOf> :匹配所有远程仓库,repo1除外。
maven获取真正起作用的repository集合流程:首先会获取pom.xml里的repository集合,然后在settings.xml里找mirrors元素,
如果repository的id和mirror的mirrorOf的值相同,则该mirror替代该repository,
如果该repository找不到对应的mirror,
则使用其本身,依此可以得到最终起作用的repository集合,
repositories中默认包含了中央仓库central,当然也可以重新它的url;
可以理解mirror是复写了对应id的repository
mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
产品 | 厂商 | 备注 | VS |
---|---|---|---|
Apache | Archiva | https://github.com/apache/archiva | |
JFrog | Artifactory | 开源版本,官网 | https://jfrog.com/blog/artifactory-vs-nexus-integration-matrix/ |
Sonatype | Nexus | oss版本开源 , 官网 | https://www.sonatype.com/nexus-vs-artifactory |
CloudRepo | https://www.cloudrepo.io/ |
下载:https://www.sonatype.com/download-oss-sonatype
文档:https://help.sonatype.com/repomanager3
解压后包含两个目录:
-Xms600m
-Xmx600m
-XX:MaxDirectMemorySize=1G
http://127.0.0.1:8081/
默认两个用户:admin和anonymous
admin 密码在admin.passworld下
初次使用需要设置下是否能够匿名下载(也可以后面设置)
Configure Anonymous Access
Enabling anonymous access will allow unauthenticated downloads, browsing, and searching of repository content by default. Permissions for unauthenticated users can be changed by editing the roles assigned to the anonymous user.
<settings>
...
<!--配置Nexus仓库-->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://localhost:8081/repository/maven-public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://localhost:8081/repository/maven-public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!--激活Nexus仓库配置 -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
...
</settings>
<settings>
...
<!--配置镜像-->
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>nexus mirror for all repositry</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
<!--配置Nexus仓库-->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots><enabled>true</enabled> </snapshots>
<releases><enabled>true</enabled> </releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central pluginRepository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!--激活Nexus仓库配置 -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
...
</settings>
pom最后添加如下配置,注意repository的id需要和settings中server的id一致,也就是以server指定的用户登录进行上传部署,普通游客没有权限部署,部署命令:mvn clean deploy
<!--配置项目生成的构件部署到Nexus私服上 -->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus ReleaseRepository</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus SnapshotsRepository</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<settings>
....
<servers>
<!--配置nexus仓库认证信息-->
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>****</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>****</password>
</server>
</servers>
...
</settings>
mvn clean deploy
对于一些开源或者有版权的jar文件,他们在远程仓库没有,所以只能将他们先下载下来,再手动上传到nexus私服上。
<server>
<id>nexus-3rd-party</id>
<username>admin</username>
<password>admin123</password>
</server>
mvn deploy:deploy-file -Dfile=G:\5jar\edu.mit.jwi_2.3.3_jdk.jar -DgroupId=local.edu.stanford -DartifactId=edu.mit.jwi_jdk -Dversion=2.3.3 -Dpackaging=jar -Durl=http://localhost:8081/repository/3rd-party/ -DrepositoryId=nexus-3rd-party
# 部署到本地仓库
mvn install:install-file -Dfile=g:\edu.mit.jwi_2.3.3_jdk.jar -DgroupId=local.edu.stanford -DartifactId=edu.mit.jwi_jdk -Dversion=2.3.3 -Dpackaging=jar -DpomFile=g:\pom.xml
https://opsx.alibaba.com/mirror
Proxy -> Remote storage
https://goproxy.io
Storage -> Strlct Content Type Vaildation 取消勾选(内容校验)Validate that all content uploaded to this repository is of a MIME type appropriate for the repository format
Negative Cache -> Not found cache enabled: 取消勾选(自动阻止无法访问资源的再次重试)Cache responses for content not present in the proxied repository
代理地址
http://IP:8081/repository/go-proxy/
阿里云
配置如下:
export GOPROXY=https://mirrors.aliyun.com/goproxy/
nexus社区提供的
配置如下:
export GOPROXY=https://gonexus.dev
goproxy.io 的
配置如下:
export GOPROXY=https://goproxy.io/
基于athens的公共服务
配置如下:
export GOPROXY=https://athens.azurefd.net
官方提供的(jfrog,golang)
export GOPROXY=https://gocenter.io
export GOPROXY=https://proxy.golang.org
七牛云赞助支持的
export GOPROXY=https://goproxy.cn
gomods/athens
git clone https://github.com/gomods/athens
cd athens
$env:GO111MODULE="on"
$env:GOPROXY="https://proxy.golang.org"
$version = "0.2.0"
$date = (Get-Date).ToUniversalTime()
go build -ldflags "-X github.com/gomods/athens/pkg/build.version=$version -X github.com/gomods/athens/pkg/build.buildDate=$date" -o athens ./cmd/proxy
docker pull gomods/athens:v0.7.0
docker run -d -p 3000:3000 --name athens --restart always gomods/athens:v0.7.0
docker run -d -v "E:/git/athens/storage:/var/lib/athens" -v "E:/git/athens/gitconfig/.gitconfig:/root/.gitconfig" -v "E:/git/athens/config/config.toml:/config/config.toml" -e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens -e ATHENS_STORAGE_TYPE=disk --name athens-proxy -p 3000:3000 --restart always gomods/athens:v0.7.0
gitea token http://git.xxx.com/user/settings/applications 生成令牌
[url "https://root:token@git.xxx.com/"]
insteadOf = https://git.xxx.com/
config.toml
SumDBs = ["https://sum.golang.google.cn"]
# NoSumPatterns specifies a list of patterns that will make the
# Sum DB proxy return a 403 if any of those patterns match.
# This will enforce the client to run GONOSUMDB
# Example pattern: NoSumPatterns = ["github.com/mycompany/*"]
# Env override: ATHENS_GONOSUM_PATTERNS
NoSumPatterns = ["git.xx.com/mycompany/*"]
https://github.com/golang/go/blob/master/src/cmd/go/internal/get/vcs.go
src/cmd/go/internal/modfetch/proxy.go
从源码得知:必须是https
GOPROXY =
https://admin:pwd@127.0.0.1:8081/repository/go-proxy/
https://blog.csdn.net/michaelwubo/article/details/80691594
#{NEXUS_DOMAIN} = nexus为服务器域名
#{NEXUS_IP} = 192.168.59.1 为服务器IP
$ cd $install-dir/etc/ssl/
$ keytool -genkeypair -keystore keystore.jks -storepass nexus3 -keypass nexus3 -alias jetty -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=*.{NEXUS_DOMAIN}, OU=Example, O=Sonatype, L=Unspecified, ST=Unspecified, C=US" -ext "SAN=DNS:{NEXUS_DOMAIN},IP:{NEXUS_IP}" -ext "BC=ca:true"
$data-dir/etc/nexus.properties
$data-dir/etc/nexus.properties
文件,修改Key为 nexus-args 所在行的值,在后面添加,${jetty.etc}
/jetty-https.xml,${jetty.etc}
/jetty-http-redirect-to-https.xml<Set name="KeyStorePath"><Property name="ssl.etc"/>/keystore.jks</Set>
<Set name="KeyStorePassword">nexus3</Set>
<Set name="KeyManagerPassword">nexus3</Set>
<Set name="TrustStorePath"><Property name="ssl.etc"/>/keystore.jks</Set>
<Set name="TrustStorePassword">nexus3</Set>
<servers>
<!--配置nexus仓库认证信息-->
<server>
<id>nexus-releases</id>
<username>xxx</username>
<password>xxx</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>xxx</username>
<password>xxx</password>
</server>
</servers>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus-release</id>
<name>nexus-release</name>
<url>http://xxx.com/repository/maven-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<name>nexus-snapshots</name>
<url>http://xxx.com/repository/maven-snapshots/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
https://cloud.tencent.com/developer/article/1492820
方案二 配置项目pom.xml 访问私服
<repositories>
<repository>
<id>xxxid</id>
<name>xxx repo name</name>
<url>http://192.168.xxx.xxx:8081/nexus/content/groups/public/</url>
</repository>
</repositories>
```xml
方案三 settings.mxl配置镜像访问私服
………
项目pom.xml配置
根pom.xml
Repository.id 对应 setting.xml 中的server.id
```xml
<!--配置项目生成的构件部署到Nexus私服上 -->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus ReleaseRepository</name>
<url>http://xxx.com/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus SnapshotsRepository</name>
<url>http://xxx.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
排除发布模块
发布命令
mvn clean deploy
方案一(不推荐)
删除不需要的module
<modules>
<module>xxx</module>
<module>xxx</module>
</modules>
方案二(推荐)
在需要排除的模块pom.xml中加入
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0-M1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>