maven负责将代码中涉及到的依赖全部从 Nexus 私服中缓存到自己的本地仓库中,然后将java代码转换成二进制,把代码中写的依赖到的类的 jar 包全部下载到服务本地的 lib 目录中,最后被压缩成 jar/war 包,压缩格式是 Zip 。如下图,利用 file 命令可以看到是 zip 格式的包,解压后再 BOOT-INF 目录中用 lib ,lib 下就是所有依赖的 jar 包。
/data/base-module/apache-maven-3.6.3/repo
linke-deploy-release
admin
df24tgeg2
nexus-deploy-snapshot
admin
df24tgeg2
起 nexus 很简单,起个 docker 把数据目录挂载出来即可。
#!/bin/bash
docker run -d \
-p 8081:8081 --name nexus \
-v /data/nexus/nexus-data:/nexus-data \
--restart=always sonatype/nexus3
启动后,浏览器 ip:port 即可打开,admin 初始密码在容器中这个文件内 /nexus-data/admin.password ,即在宿主机 /data/nexus/nexus-data/admin.password 文件内。
nexus 启动后,在 browse 中,默认有两个 group 、两个 proxy 、两个 hosted 、
登录后,在设置下的 repositories 菜单中可以查看每个类型的配置信息,也可以添加新类型。最常用的一般是 proxy ,对于大多公司而言,group 都使用的是自带的 maven-public , 私有依赖都上传在 hosted 中。添加完新的 proxy 后,将这个 proxy 再添加到 maven-public 名字的 group 下。
如图是归属在 maven-public group 下默认的几个成员
可以看到,在 maven-public 组下,有默认的三个成员。maven-central 是 proxy 类型,代理的公网的依赖源;maven-releases 和 maven-snapshots 都是 hosted 类型,即本地文件。因此从 maven-public 下可以查询到这三个成员下所有的依赖 jar 包。
我们可以再看一下自带的 maven-central ,代理的是 https://repo1.maven.org/maven2/ 仓库
当然还有写别的公网仓库,如国内的阿里云的仓库,这时我们就需要单独加一个 proxy ,然后再加到 maven-public 组下。
阿里云仓库汇总地址 https://developer.aliyun.com/mvn/view
下面我们将上面红框的 sprint 的仓库加到私服的代理中,然后加到 maven-public 组下
找到 maven2 proxy
写好 Name(最好和公网的私服名字写一样) 、Remote storage(复制公网私服的地址)
下面将 sprint 这个成员加到 maven-public 中。
加进来以后,使用 maven 编译时,依赖到这个仓库的 jar 包就会被拉取到了。注意:刚刚加入时,不被使用的话,在 browse 中是看不到这个仓库的目录的,当编译一次后,这个成员被使用了的话,就可以在 browse 一栏中看到这个仓库的内容了。
当编译时被调用后,就可以看到了
上传 jar 包时,一定要把打这个 jar 包时生成的 pom 文件一并传上来。如果不传编译 jar 包时自动生成的 pom ,那么传到 nexus 上后,该 jar 包会自动生成一个 pom 文件,但是这个 pom 文件内的依赖只有它自己,它依赖到的其它依赖找不到。
1、上传 jar 包和它的 pom 文件到私服中。
mvn \
deploy:deploy-file \
-Dpackaging=jar \
-DgroupId=com.winchannel.vitamin \
-DartifactId=weixin-java-common \
-Dfile=weixin-java-common-0.0.2-SNAPSHOT-master.jar \
-Dversion=0.0.2-SNAPSHOT-master \
-DpomFile=weixin-java-common-0.0.2-SNAPSHOT-master.pom \
-Durl=http://192.168.1.189:8081/repository/maven-releases/ \
-DrepositoryId=winchannel-deploy-snapshot \
-X
注解:
deploy:deploy-file # 动作类型为部署包参数
-Dpackaging=jar # 上传包类型是 jar 包
-DgroupId=com.winchannel.vitamin # 上传文件的路径,对应到 nexus web 中是目录路径
-DartifactId=weixin-java-common # 上传文件的包名,对应到 nexus web 中是 com/winchannel/vitamin/weixin-java-common 目录
-Dversion=0.0.2-SNAPSHOT-master # 上传文件的版本号,对应到 nexus web 中是 com/winchannel/vitamin/weixin-java-common/0.0.2-SNAPSHOT-master
-Dfile=weixin-java-common-0.0.2-SNAPSHOT-master.jar # 要上传的文件名
-DpomFile=weixin-java-common-0.0.2-SNAPSHOT-master.pom # 要上传文件的 pom 文件
-Durl=http://192.168.1.189:8081/repository/maven-releases/ # 传到 nexus 中哪个 hosted 命名下
-DrepositoryId=winchannel-deploy-snapshot # 使用 maven 工具配置的哪个 server id 进行 nexus 的认证。
-X # 打印 dbug
上传完毕后,在 nexus 的 maven-public 中的对应路径可以看到,前面的路径不好截图,自己脑补即可。
2、只上传 pod 文件到私服中。
mvn \
deploy:deploy-file \
-Dpackaging=pom \
-DgroupId=com.winchannel.vitamin \
-DartifactId=wx-java \
-Dversion=0.0.2-SNAPSHOT-master \
-Dfile=wx-java-0.0.2-SNAPSHOT-master.pom \
-Durl=http://192.168.1.189:8081/repository/maven-releases/ \
-DrepositoryId=winchannel-deploy-snapshot \
-X
注解:
-Dpackaging=pom #和上面传 jar 包不同的是 -Dpackaging 类型是 pom
3、上传 jar 包到 maven 本地,而不上传到私服中。
mvn \
install:install-file \
-Dpackaging=jar \
-DgroupId=com.winchannel.vitamin \
-DartifactId=weixin-java-common \
-Dfile=weixin-java-common-0.0.2-SNAPSHOT-master.jar \
-Dversion=0.0.2-SNAPSHOT-master \
-DpomFile=weixin-java-common-0.0.2-SNAPSHOT-master.pom \
注解:
install:install-file # 动作类型为安装包参数
-Durl 、 -DrepositoryId # 和私服相关的这两个参数不需要
上传完毕后,在 maven 的本地 repo 目录下的 com/winchannel/vitamin 可以查看到