maven是一个项目管理和综合工具,提供给开发人员构建一个完整的生命周期框架;
开发团队可以自动完成该项目的基础设施建设, maven使用标准的目录结构和默认构建生命周期;
apache开源项目主要服务于java平台构建,依赖项目,项目管理;
Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。
该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。
mvn package # 会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下
私服是架设在区域网的一种特殊远程仓库, 目的是代理远程仓库及部署第三方构件, 有了私服之后, 当maven需要下载构件时,直接请求私服, 私服上存在则下载本地仓库, 否则私服请求外部的远程仓库, 将构件下载到私服, 再提供给本地仓库下载;
nexus是一个强大的maven仓库管理器,它极大的简化了本地内部仓库的维护和外部仓库的访问.
nexus是一套开箱即用的系统不需要数据库,它使用文件系统加Lucene来组织数据
nexus使用ExtJS来开发界面,利用Restlet来提供完整的REST APIs,通过IDEA和Eclipse集成使用
nexus支持webDAV与LDAP安全身份认证.
nexus提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,占用较少的内存,基于简单文件系统而非数据库.
工作流程
hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库;
proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库;
group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可;
我们前面讲到类型为hosted的为本地仓库,Nexus预定义了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是做什么用的:
Releases: 这里存放我们自己项目中发布的构建, 通常是Release版本的, 比如我们自己做了一个FTP Server的项目, 生成的构件为ftpserver.war, 我们就可以把这个构建发布到Nexus的Releases本地仓库. 关于符合发布后面会有介绍.
Snapshots:这个仓库非常的有用, 它的目的是让我们可以发布那些非release版本, 非稳定版本, 比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用, 因为你的同伴正在依赖你的模块开发, 那么这个时候我们就可以发布Snapshot版本到这个仓库, 你的同伴就可以通过简单的命令来获取和使用这个临时版本.
3rd Party:顾名思义, 第三方库, 你可能会问不是有中央仓库来管理第三方库嘛,没错, 这里的是指可以让你添加自己的第三方库, 比如有些构件在中央仓库是不存在的. 比如你在中央仓库找不到Oracle 的JDBC驱动, 这个时候我们就需要自己添加到3rdparty仓库。
# 解压部署
[root@jenkins-2 ~]# tar xf apache-maven-3.6.2-bin.tar.gz
[root@jenkins-2 ~]# mv apache-maven-3.6.2/* /opt/maven/
[root@jenkins-2 ~]# tail -3 /etc/profile
JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export MAVEN_HOME=/opt/maven
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH
[root@jenkins-2 ~]# source /etc/profile
# 测试maven是否安装成功
[root@jenkins-2 ~]# mvn -v
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-27T23:06:16+08:00)
Maven home: /opt/maven
Java version: 1.8.0_121, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_121/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"
validate(验证): 验证项目正确,而且全部必要信息可用。compile(编译): 编译项目源码
test(测试): 使用合适的单元测试框架测试编译后的源码。
package(打包): 源码编译以后,使用合适的格式(例如JAR格式)对编译后的源码进行打包。integration-test(集成测试): 若是有须要,把包处理并部署到能够运行集成测试的环境中去。verify(验证): 进行各类测试来验证包是否有效而且符合质量标准。
install(安装): 把包安装到本地仓库,使该包能够做为其余本地项目的依赖。
deploy(部署): 在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其余开发人员和项目共享。
clean (清除) : 清除上次编译的结果
tar xf nexus-3.13.0-01-unix.tar.gz -C /opt/
cd /opt/nexus-3.13.0-01/bin/
./nexus start
# 验证端口
lsof -i:8081
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 23141 root 752u IPv4 59496716 0t0 TCP *:tproxy (LISTEN)
java 23141 root 756u IPv4 59520286 0t0 TCP client-1:tproxy->123.112.188.190:10250 (ESTABLISHED)
# 查看日志
tailf /opt/sonatype-work/nexus3/log/nexus.log |head -10
点击右上角的sign in登录,输入账户
admin/admin123
点击“设置-Repositories”,就可以看到仓库,分三种类型:
maven-public:maven-central、maven-release和maven-snapshot三个库的合集;
maven-release:用来存放release版本的jar包;
maven-snapshot:用来存放snapshot版本的jar包。
关于Maven的Snapshot版本与Release版本
1 . Snapshot版本代表不稳定、尚处于开发中的版本
2 . Release版本则代表稳定的版本
3 . 什么情况下该用SNAPSHOT? 协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNAPSHOT来标识自己。这种做法的必要性可以反证如下:
a.如果B不用SNAPSHOT,而是每次更新后都使用一个稳定的版本,那版本号就会升得太快,每天一升e68a84e8a2ade79fa5e9819331333363396362甚至每个小时一升,这就是对版本号的滥用。
b.如果B不用SNAPSHOT, 但一直使用一个单一的Release版本号,那当B更新后,A可能并不会接受到更新。因为A所使用的repository一般不会频繁更新release版本的缓存(即本地repository),所以B以不换版本号的方式更新后,A在拿B时发现本地已有这个版本,就不会去远程Repository下载最新的B;
4 . 不用Release版本,在所有地方都用SNAPSHOT版本行不行? 不行。正式环境中不得使用snapshot版本的库。 比如说,今天你依赖某个snapshot版本的第三方库成功构建了自己的应用,明天再构建时可能就会失败,因为今晚第三方可能已经更新了它的snapshot库。你再次构建时,Maven会去远程repository下载snapshot的最新版本,你构建时用的库就是新的jar文件了,这时正确性就很难保证了;
至此创建仓库完成
登录 2/password,点击upload
修改Nexus默认认证信息(132行注释下加)
vim /opt/maven/conf/settings.xml
<server>
<id>my-nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>my-nexus-snapshot</id>
<username>admin</username>
<password>admin123</password>
</server>
再修改server标签后添加镜像: 168行下
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.0.7:8081/repository/maven-public/</url>
</mirror>
在修改mirrir标签后添加仓库信息,最下面几行
<id>nexus</id>
<!--Enable snapshots for the built in central repo to direct -->
<!--all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>http://192.168.0.7:8081/repository/maven-public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://192.168.0.7:8081/repository/maven-public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profiles>
激活仓库, profiles下面
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
hosted(私有仓库): 发布个人开发的npm组件;
proxy(代理仓库): 可以代理npm和淘宝镜像;
group(组合仓库): 对外公开的仓库,集合hosted和proxy;
代理远程地址可以随便选,此处选https://registry.npm.taobao.org
选择要包括的仓库,越靠上优先级越高,如果私有仓库在上,用户下载npm包的时候会优先下载私有仓库中的,如果私有仓库没有再去代理仓库中下载。
用户设置npm的registry为group仓库
npm config set registry http://私服ip:8081/repository/private-npm-group/
npm login -registry=http://npm私服所在服务器的ip地址:8081/repository/private-npm-hosted/
输入用户名,密码,邮箱
npm publish -registry=http://npm私服所在服务器的ip地址:8081/repository/private-npm-hosted/
校验是否成功
[root@client-1 js_design_node_usersrv]# npm publish -registry=http://42.193.126.123:8081/repository/private-npm-hosted/
npm notice
npm notice 📦 docker_web_app@1.0.0
npm notice === Tarball Contents ===
npm notice 190B Dockerfile
npm notice 11.3kB Jenkinsfile
npm notice 168B server.js
npm notice 265B package.json
npm notice 52B README.md
npm notice 1.7kB deploy.yaml
npm notice === Tarball Details ===
npm notice name: docker_web_app
npm notice version: 1.0.0
npm notice package size: 4.3 kB
npm notice unpacked size: 13.7 kB
npm notice shasum: e4bf3efd0754eb01410f8287af71931da02babc0
npm notice integrity: sha512-ficCekkzCO3Dz[...]iucfiOoQvuRGA==
npm notice total files: 6
npm notice
+ docker_web_app@1.0.0
设置npm源地址
npm config set registry http://私服ip:8081/repository/private-npm-group/
example1
# 登录nexus
[root@client-1 js_design_node_usersrv]# npm login -registry=http://42.193.126.123:8081/repository/private-npm-hosted/
Username: 3
Password:
Email: (this IS public) 18621048481@163.com
Logged in as 3 on http://42.193.126.123:8081/repository/private-npm-hosted/.
# 使用内网仓库下载
[root@client-1 js_design_node_usersrv]# npm --registry http://42.193.126.123:8081/repository/private-npm-group/ install
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN docker_web_app@1.0.0 No repository field.
npm WARN docker_web_app@1.0.0 No license field.
added 50 packages from 37 contributors in 6.088s
# 第二次下载走内网缓存可以发现快了很多
[root@client-1 js_design_node_usersrv]# npm --registry http://42.193.126.123:8081/repository/private-npm-group/ install
npm WARN docker_web_app@1.0.0 No repository field.
npm WARN docker_web_app@1.0.0 No license field.
up to date in 0.456s
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。