为什么要搭建maven私服?
毕竟不是传奇私服,好好的maven不用,为什么要搭建maven私服呢?其实这个问题有很多答案,我这边搭建私服的目的有两个:
- 封装公共类库,以工具类和验证类为主。
- 封装权限系统,将权限系统分为带部门的审批权限系统和不带部门的浏览权限系统两种,根据具体的业务,引入不同的权限系统。
安装并启动Nexus3(Windows)
由于我们的服务器都是windows2008的版本,所以我这边在服务器上也是安装的Nexus3的Windows版。
安装方法如下: - 下载地址:http://www.sonatype.com/download-oss-sonatype
然后选择Windows版进行下载
下载完成后是一个压缩包,将压缩包进行解压。
- 这里注意有一个坑,解压的地址一定不要放在C盘,因为系统盘有读写权限的问题,会导致启动不成功报错,最好将解压后的文件放在一个非系统盘且路径不含中文的文件夹中。
然后打开E:\nexus-3.11.0-01-win64\nexus-3.11.0-01目录,找到bin文件加,按住shift键并点击鼠标右键,选择在此处打开窗口命令,然后在命令行输入启动的命令:
- nexus.exe/run 回车
这个命令窗口就会开始启动项目,当控制台显示”:Started Sonatype Nexus OSS 3.11.0-01”时就说明Nexus3的服务已经启动了。
之后在浏览器地址栏输入:http://localhost:8081 就可以访问nexus3的服务台了。
点击右上角的Sign In就可以登录该管理平台,管理平台默认的用户名为admin,密码为admin123。
登录之后这个管理平台暂时就可以放在那里备用了,如果有需求,可以自行百度一下如何新建账户和更改默认端口号。
基础说明和相关问题
- component name的一些说明:
1) maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
2) maven-releases:私库发行版jar
3)maven-snapshots:私库快照(调试版本)jar
4)maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。 - Nexus默认的仓库类型有以下四种:
1)group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
2)hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);
3)proxy(代理类型):从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage Location属性的值即被代理的远程仓库的路径);
4)virtual(虚拟类型):虚拟仓库(这个基本用不到,重点关注上面三个仓库的使用); - Policy(策略):表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库;
- Public Repositories下的仓库
1) 3rd party: 无法从公共仓库获得的第三方发布版本的构件仓库,即第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去;
2)Apache Snapshots: 用了代理ApacheMaven仓库快照版本的构件仓库
3)Central: 用来代理maven中央仓库中发布版本构件的仓库
4)Central M1 shadow: 用于提供中央仓库中M1格式的发布版本的构件镜像仓库
5)Codehaus Snapshots: 用来代理CodehausMaven 仓库的快照版本构件的仓库
6)Releases: 内部的模块中release模块的发布仓库,用来部署管理内部的发布版本构件的宿主类型仓库;release是发布版本;
7)Snapshots:发布内部的SNAPSHOT模块的仓库,用来部署管理内部的快照版本构件的宿主类型仓库;snapshots是快照版本,也就是不稳定版本
所以自定义构建的仓库组代理仓库的顺序为:Releases,Snapshots,3rd party,Central。也可以使用oschina放到Central前面,下载包会更快。 - Nexus默认的端口是8081,可以在etc/nexus-default.properties配置中修改。
- Nexus默认的用户名密码是admin/admin123
- 当遇到奇怪问题时,重启nexus,重启后web界面要1分钟左右后才能访问。
以上这些描述和问题,在你今后的使用过程中一定能用得上,目前来说,可以暂时过一遍对这些基础知识有个了解即可。
配置Maven的Settings.xml
Settings.xml是Maven的配置文件,其路径有两个,分为全局配置和用户配置:
- 全局配置为:Maven的安装目录/conf/settings.xml
- 用户配置为:C:\用户(你的用户名).m2\settings.xml
先强调一点,全局配置这个文件默认是不存在的,需要用户自己手动创建。
其调用规则是,默认使用全局配置,但是如果设置了用户配置,则会合并这两个配置文件的信息,如果有相同的配置参数,则优先使用用户配置中的参数。
现在来看一下我的Settings.xml,我是自己创建了用户配置的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54<settings>
<mirrors>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://172.18.18.21:8081/repository/maven-public/</url>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<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://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
<pluginGroups>
<pluginGroup>org.sonatype.plugins</pluginGroup>
</pluginGroups>
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
</settings>
其实就是一个XML的配置文件,其内部有很多标签来实现不通的配置:
Mirrors
1 |
|
镜像仓库,内部由n个mirror节点组成。用来代替中央仓库(Maven默认的远程仓库),用于提升传输速度。因此此处可以添加一个镜像,以提升我们下载的速度。
我的配置文件里就包含了两个镜像,一个是我自己本地的私有镜像库,另一个就是Maven的镜像库。
Profiles
1 | <profiles> |
用于覆盖在一个POM或者profiles.xml文件中的任何相同id的profiles节点,这里的主要是用来设置nexus服务的相关配置和调用的库的。
activeProfiles
1 | <activeProfiles> |
activeProfile值为profile中所定义的id,在这里定义的activeProfile总是被激活.
Servers
1 | <servers> |
服务器,内部由n个server节点组成。有2种配置方式:一种是通过id匹配,username和password进行认证登录;另一种是通过id匹配指向一个privateKey(私钥)和一个passphrase,目前这个配置文件使用的是第一种验证方式。
以上这些大概就是Settings.xml配置文件的所有配置参数了,只有配置好这里,你的项目才可以很好的和Nexus私服进行联动。
项目上传到Nexus私服
现在你的基础环境已经准备好了,现在可以将项目上传到Nexus的私服了,其主要操作都集中在项目的pom.xml文件中,现在贴出我的项目pom文件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dhcc</groupId>
<artifactId>commonlib</artifactId>
<version>1.2</version>
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
<distributionManagement>
<repository>
<id>nexus</id>
<name>Releases</name>
<url>http://172.18.18.21:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://172.18.18.21:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--easypoi导出excel-->
<dependency>
<groupId>org.jeecg</groupId>
<artifactId>easypoi-base</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.jeecg</groupId>
<artifactId>easypoi-web</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.jeecg</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
</project>
其实大部分还是项目自带的配置文件内容,在这个基础上加入了一些针对私有Maven库的插件配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
- defaultGoal:执行build任务时,如果没有指定目标,将使用的默认值,如:在命令行中执行mvn,则相当于执行mvn install;
- maven-compiler-plugin:指定项目源码的JDK版本和编译后的JDK版本,以及编码等。
- maven-surefire-plugin:surefire 插件用来在maven构建生命周期的test phase执行一个应用的单元测试。
如果发生# org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test (default-test) on project的错误,记得加上1
2
3<configuration>
<skipTests>true</skipTests>
</configuration>
还有一些配置就是和Maven私有库连接了:1
2
3
4
5
6
7
8
9
10
11
12 <distributionManagement>
<repository>
<id>nexus</id>
<name>Releases</name>
<url>http://172.18.18.21:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://172.18.18.21:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
这段代码主要就是和Nexus进行连接的配置代码,配置上传的代码库地址等。
首先id是nexus,就说明这个id其实就是settings.xml的server的id,负责确定服务配置的,之后是name标签就是标识这个库具体是什么用途的,有releases版和snapshot版两个地址,之后的url就是代码库的链接了。
然后在IDEA中通过控制台执行 mvn clean deploy或者通过IDEA界面右侧的Maven Prjects的lifecycle来执行
如果期间没什么问题,执行完deploy相关的代码就会提交到Nexus服务器指定的库中去了。
可以看到相关的commonlib项目已经进入到maven-release库中去了,如果想要发布到snapshot库,就把artifactId中的commonlib后面加上”-snapshot”即可。
这里还要提到一个知识点,就是如果你只是想让你的某一个或几个项目使用Nexus私服而其他的项目还要使用Maven的库,那就不要在.m2文件夹里放置settings.xml而将其改名为其他的名字比如:settings2.xml,这样这个配置文件就不会默认覆盖你的Maven配置,而你某一个项目想用这个私有Maven库该怎么办呢?看下图:
只要单独给项目所在的IDEA下修改Settings->Build Excution Deployment->Build Tools ->Maven中的User Settings file ,然后选中Override选项后在选择你想使用的配置文件即可。
在Springboot中使用Nexus私服的库
使用Nexus私服的库有两种方式:
第一种是在Pom.xml中加入:1
2
3
4
5
6<repositories>
<repository>
<id>nexus</id>
<url>http://172.18.18.21:8081/repository/maven-releases/</url>
</repository>
</repositories>
并引入你要加入的Dependency就可以了1
2
3
4
5<dependency>
<groupId>com.dhcc</groupId>
<artifactId>commonlib</artifactId>
<version>1.2</version>
</dependency>
还有一种方式就是通过修改IDEA的默认settings.xml来实现,上一节已经介绍过了,只要修改了配置文件,对应的项目也自然会去私服上下载对应的依赖文件,达到的效果是一样的。