目录
四、 maven 私服
1. 需求
正式开发,不同的项目组开发不同的工程。
dao 工程开发完毕,发布到私服。
service 从私服下载 dao
2. 分析
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内 部的 maven 远程仓库,每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自 己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件
(jar)。
私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载,如下 图:
3. 搭建私服环境
下载 nexusNexus 是 Maven 仓库管理器,通过 nexus 可以搭建 maven 仓库,同时 nexus 还提供强 大的仓库管理功能,构件搜索功能等。
下载 Nexus, 下载地址:
下载:nexus-2.12.0-01-bundle.zip
安装 nexus
解压 nexus-2.12.0-01-bundle.zip,本教程将它解压在 F 盘,进入 bin 目录:
cmd 进入 bin 目录,执行 nexus.bat install
安装成功在服务中查看有 nexus 服务:
卸载 nexus
cmd 进入 nexus 的 bin 目录,执行:nexus.bat uninstall
查看 window 服务列表 nexus 已被删除。
启动 nexus
方法 1:
cmd 进入 bin 目录,执行 nexus.bat start
方法 2:
直接启动 nexus 服务
查看 nexus 的配置文件 conf/nexus.properties
# Jetty section
application-port=8081 # nexus 的访问端口配置 application-host=0.0.0.0 # nexus 主机监听配置(不用修改) nexus-webapp=${bundleBasedir}/nexus # nexus 工程目录 nexus-webapp-context-path=/nexus # nexus 的 web 访问路径
# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus # nexus 仓库目录
runtime=${bundleBasedir}/nexus/WEB-INF # nexus 运行程序目录
访问:
:8081/nexus/
使用 Nexus 内置账户 admin/admin123 登陆: 点击右上角的 Log in,输入账号和密码 登陆
登陆成功:
3.5 仓库类型
nexus
查看 nexus 的仓库:
nexus 的仓库有 4 种类型:
1. hosted,宿主仓库,部署自己的 jar 到这个类型的仓库,包括 releases 和 snapshot 两部 分,Releases 公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
2. proxy,代理仓库,用于代理远程的公共仓库,如 maven 中央仓库,用户连接私服,私 服自动去中央仓库下载 jar 包或者插件。
3. group,仓库组,用来合并多个 hosted/proxy 仓库,通常我们配置自己的 maven 连接仓 库组。
4. virtual(虚拟):兼容 Maven1 版本的 jar 或者插件
nexus 仓库默认在 sonatype-work 目录中:
central:代理仓库,代理中央仓库
apache-snapshots:代理仓库存储 snapshots 构件,代理地址 https://repository.apache.org/snapshots/
central-m1:virtual 类型仓库,兼容 Maven1 版本的 jar 或者插件releases:本地仓库,存储 releases 构件。
snapshots:本地仓库,存储 snapshots 构件。thirdparty:第三方仓库public:仓库组4. 将项目发布到私服
4.1 需求
企业中多个团队协作开发通常会将一些公用的组件、开发模块等发布到私服供其它团队 或模块开发人员使用。
本例子假设多团队分别开发 dao、service、web,某个团队开发完在 dao 会将 dao 发布到私服供 service 团队使用,本例子会将 dao 工程打成 jar 包发布到私服。
上传
上传
maven-dao 工程
私服(服务端) nexus
maven-service 工程
4.2 配置
第一步:需要在客户端即部署 dao 工程的电脑上配置 maven 环境,并修改 settings.xml
文件,配置连接私服的用户和密码 。 此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和 密码一致。
<server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server>releases 连接发布版本项目仓库
snapshots 连接测试版本项目仓库
第二步: 配置项目 pom.xml
配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号 决定上传到哪个宿主仓库,如果版本为 release 则上传到私服的 release 仓库,如果版本为 snapshot 则上传到私服的 snapshot 仓库
<distributionManagement> <repository> <id>releases</id> <url>:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <url>:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement>注意:pom.xml 这里<id> 和 settings.xml 配置 <id> 对应!
4.3 测试
将项目 dao 工程打成 jar 包发布到私服:
1、首先启动 nexus
2、对 dao 工程执行 deploy 命令
根据本项目pom.xml中version定义决定发布到哪个仓库,如果 version定义为 snapshot, 执行 deploy 后查看 nexus 的 snapshot 仓库,如果 version 定义为 release 则项目将发布到 nexus 的 release 仓库,本项目将发布到 snapshot 仓库:
也可以通过 http 方式查看:
5. 从私服下载 jar 包
5.1 需求
没有配置 nexus 之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网 内部署一台私服服务器,有了私服本地项目首先去本地仓库找 jar,如果没有找到则连接私 服从私服下载 jar 包,如果私服没有 jar 包私服同时作为代理服务器从中央仓库下载 jar 包, 这样做的好处是一方面由私服对公司项目的依赖 jar 包统一管理,一方面提高下载速度,项 目连接私服下载 jar 包的速度要比项目连接中央仓库的速度快的多。
本例子测试从私服下载 dao 工程 jar 包。
5.2 管理仓库组
nexus中包括很多仓库,hosted 中存放的是企业自己发布的jar包及第三方公司的 jar包, proxy 中存放的是中央仓库的 jar,为了方便从私服下载 jar 包可以将多个仓库组成一个仓库 组,每个工程需要连接私服的仓库组下载 jar 包。
打开 nexus 配置仓库组,如下图:
上图中仓库组包括了本地仓库、代理仓库等。
5.3 在 setting.xml 中配置仓库
在客户端的 setting.xml 中配置私服的仓库,由于 setting.xml 中没有 repositories 的配置 标签需要使用 profile 定义仓库。
<profile>
<!--profile 的 id-->
<id>dev</id>
<repositories>
<repository>
<!--仓库 id,repositories 可以配置多个仓库,保证 id 不重复-->
<id>nexus</id>
<!--仓库地址,即 nexus 仓库组的地址-->
<url>:8081/nexus/content/groups/public/</url>
<!--是否下载 releases 构件-->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载 snapshots 构件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven 的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
使用 profile 定义仓库需要激活才可生效。
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
配置成功后通过 eclipse 查看有效 pom,有效 pom 是 maven 软件最终使用的 pom 内容,程 序员不直接编辑有效 pom,打开有效 pom
有效 pom 内容如下:
下边的 pom 内容中有两个仓库地址,maven 会先从前边的仓库的找,如果找不到 jar 包再从 下边的找,从而就实现了从私服下载 jar 包。
<repositories> <repository> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> <id>public</id> <name>Public Repositories</name> <url>:8081/nexus/content/groups/public/</url> </repository> <repository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>public</id> 5.4 测试从私服下载 jar 包 <name>Public Repositories</name> <url>:8081/nexus/content/groups/public/ </url> </pluginRepository> <pluginRepository> <releases> <updatePolicy>never</updatePolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> </pluginRepository> </pluginRepositories>测试 1:局域网环境或本地网络即可
在 service 工程中添加以上配置后,添加dao 工程的依赖,删除本地仓库中dao
工程,同时在 eclipse 中关闭 dao 工程。 观察控制台:
项目先从本地仓库找 dao,找不到从私服找,由于之前执行 deploy 将 dao 部署到 私服中,所以成功从私服下载 dao 并在本地仓库保存一份。
如果此时删除私服中的 dao,执行 update project 之后是否正常? 如果将本地仓库的 dao 和私服的 dao 全部删除是否正常? 测试 2:需要互联网环境
在项目的 pom.xml 添加一个依赖,此依赖在本地仓库和私服都不存在,maven 会先从本 地仓库找,本地仓库没有再从私服找,私服没有再去中央仓库下载,jar 包下载成功在私服、 本地仓库分别存储一份。
五、 把第三方 jar 包放入本地仓库或私服
1. 导入本地库
随便找一个 jar 包测试,可以先 CMD 进入到 jar 包所在位置,运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37
-Dfile= fastjson-1.1.37.jar -Dpackaging=jar
2. 导入私服
需要在 maven 软件的核心配置文件 settings.xml 中配置第三方仓库的 server 信息
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
才能执行一下命令
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37
-Dpackaging=jar -Dfile=fastjson-1.1.37.jar
-Durl=:8081/nexus/content/repositories/thirdparty/
-DrepositoryId=thirdparty
3. 参数说明
DgroupId 和 DartifactId 构成了该 jar 包在 pom.xml 的坐标,项目就是依靠这两个属性定位。 自己起名字也行。
Dfile 表示需要上传的 jar 包的绝对路径。
Durl 私服上仓库的位置,打开 nexus——>repositories 菜单,可以看到该路径。
DrepositoryId 服务器的表示 id,在 nexus 的 configuration 可以看到。
Dversion 表示版本信息,
关于 jar 包准确的版本: 包的名字上一般会带版本号,如果没有那可以解压该包,会发现一个叫 MANIFEST.MF 的文件,
这个文件就有描述该包的版本信息。
比如 Specification-Version: 2.2 可以知道该包的版本了。 上传成功后,在 nexus 界面点击 3rd party 仓库可以看到这包