记得最早进行 web 开发的时候,采用 SSM 架构,一些相关的 jar 包需要自行到官网上搜索下载到本地,然后手动将 jar 引入项目中使用。而今对于依赖的管理已经进步了很多,由构建工具(Maven/Gradle)去自动处理,程序员只需要声明需要什么 Jar,去哪里拿。

在企业内部,一般都会搭建一套自己的 Jar 仓库,没错,就是用 Nexus,Nexus 还可以用作 NPM、docker、helm、apt、yum 等的私服,感兴趣可以上官网看看。

这里采用 Nexus 2 搭建私服,Nexus 2:Windows 下载地址Linux 下载地址

解压后得到两个文件夹:nexus-2.14.20-02、sonatype-work。

进入 nexus-2.14.20-02/bin/,执行如下命令启动 Nexus

./nexus start

博主环境的默认 jdk 为 openjdk11,启动时报错,提示缺少了 jar,原因是 jdk11 中移除了 javax.xml.bind 的 jar,解决方法是手工引入 jaxb-api-2.3.1.jar、activation-1.1.1.jar 到 nexus-2.14.20-02/lib 下。如果环境中存在合适的 jdk 版本,比如 jdk8,那么也可以在 nexus-2.14.20-02/bin/jsw/conf/wrapper.conf 中指定程序运行时使用的 jdk,如下

set.JAVA_HOME=/opt/jdk1.8.0_40/
wrapper.java.command=%JAVA_HOME%/bin/java 

启动后,到浏览器访问 http://<192.168.80.202>:8081/nexus,管理员初始账号为 admin/admin123 。

点击左侧的 Repositories 就可以看到所有的仓库,而我们一般要引用的就是 Public Repository 这个仓库,这个仓库可以将几个仓库中的 jar 整合到一个统一的索引路径下,省去在构建工具中引用多个仓库。

当在构建工具的配置文件中设置好使用这个私服仓库地址后,在向私服请求依赖时如果私服没有,就会去互联网上的中央仓库(或者其他配置了 Proxy 仓库的对应外网仓库)中取,并缓存到本地。还记得压缩包解压得到了两个目录,私服的 jar 就存在 sonatype-work/nexus/storage 下,界面上的每一个仓库对应一个目录。

仓库有几种类型:group(public)、hosted(release、snapshots、3rd party)、proxy(apache snapshots、central)、virtual(central m1)。

group 就是前面说过的,把多个仓库整合成一个;hosted 是定义在私服本地的仓库;proxy 对应到私服外的仓库;virtual 只是一个仓库格式适配器,比如这里把 central 适配为 central-m1。

hosted 仓库一般放企业自己用的不对外的 jar。hosted 仓库有一个很有意思的用法,假设我们创建了一个 cq-hosted 的仓库,该仓库的所有依赖显然存储在 sonatype-work/nexus/storage/cq-hosted/ 下。

现在我们的思维暂时跳跃一下:当用 maven 作为构建工具,构建完毕,依赖会按照 GAV 提供的信息以一定的结构存放在本地(如果没有在 ~/.m2/setting.xml 中设置过 localRepository,就放在 ~/.m2/repository/ 下,这个仓库在 gadle 中通过 mavenLocal() 来引用)。

完全可以直接将 ~/.m2/repository/ 下的内容原封不动地拷贝到 sonatype-work/nexus/storage/cq-hosted/ 下(然后在 cq-hosted 仓库上 update index),就可以将本地仓库发布到 cq-hosted 仓库,他们的依赖路径结构是完全一样的。再将 cq-hosted 仓库加入 public 仓库组,就可以通过 public 仓库使用了。

对于 nexus-3,因为存储采用了 blob,所以是不支持这样直接拷贝的。而使用 gradle 来构建的话,它将获取到本地的依赖视为缓存,其 caches 下的依赖路径结构和 nexus-2 上的截然不同(当然也是存在一定的对应关系,但远不如 maven 方便)。

如果私服不能联网,那如上直接搬本地仓库也是可行的。

# 读取当前路径下的 pom.xml,将依赖 jar 放到 ./target/dependency 下,并保持下载到本地仓库时的目录结构
mvn -U -f ./pom.xml -D mdep.copyPom=true -D mdep.addParentPoms=true -D outputAbsoluteArtifactFilename=true -D mdep.useRepositoryLayout=true dependency:copy-dependencies

官方参考

分类: CODE

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注