1.搭建Maven私服背景

公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多。

这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库  和    Maven远程仓库  之间的一个缓冲仓库。

 

那要构建一个maven私服,需要用到Maven仓库管理软件,关于Apache Archiva,Artifactory,Sonatype Nexus的区别,有下面这些的参考对比:

http://blog.sina.com.cn/s/blog_72ef7bea0102vq0k.html

http://www.sonatype.org/nexus/2015/02/23/migrating-from-artifactory-archiva-or-a-raw-maven-repository-to-sonatype-nexus/

 

 

2.安装Nexus,并初次启动Nexus

这里我们下载开源版 Nexus OSS。Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。下载地址:http://www.sonatype.org/nexus/go

这里先以windows上为例【Linux上之后再来一份】

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库

 

在你点击下载之后,会有Read THE BOOK 的入口和加入NENUX社区的入口。

这里直接给你ReadTheBook的地址:https://help.sonatype.com/display/NXRM3

这里你可以找到官方提供的完整安装和使用教程。【因为这里使用的是Nexus3的版本,和参考文章中不大一致】

 

下载的压缩包解压下来

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_02

 

然后cmd,命令窗口进入nexus-3.5.2-01目录下的bin目录下,按照官方的启动方式,需要在bin目录下使用nexus /run命令启动,如下图

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_03

确认之后,下面会打印出来启动的相关信息,接下来,耐心等待它启动完成。

直到出现下面这个,才算启动完成。

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_04

 

 

初次启动之后,你可以在浏览器上访问nexus这个maven管理器

地址:http://localhost:8081/

当然,你可以使用默认的用户登录。

用户名:admin

密码:admin123

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_05

 

此时,观看命令窗口,会有记录相关的操作记录。

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_06

 

 

 3.将nexus配置为系统服务

根据官方文档说明,将nexus配置为系统服务是一个很好的选择。因为

第一:上面的安装和启动过程并没有默认的把nexus作为服务加入系统服务中;

第二:这样下次服务器重启,服务也会重启。

但是这个有个前提,就是已经确保安装了Java运行时环境。

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_07

 

 

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_08

接下来,我们重新打开一个窗口,去将nexus加入系统服务  

最后的<optional-service-name>,咱们直接命名成nexus就好。【当然,最后这个不指定的话,默认就是创建成nexus服务名】

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_09

在windows7上安装nexus为系统服务时,报错:could not open SCManager 

但是报错如下:

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_10

 

解决方法:

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_11

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_12

 

然后再次运行

如果再解决不了,那就在

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_13

直接以管理员身份运行这个命令提示符,然后安装服务。

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_14

 

显示安装成功之后,可以进入控制面板---》管理工具---》服务  

查找名为nexus的服务

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_15

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_16

 

你可以选择,点击上面的启动按钮启动服务,也可以用下面的命令启动服务

【当然,可以在上面配置启动参数,这个之后再去查看配置】

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_17

 

 

启动完成之后,试着访问一下http://localhost:8081/

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_18

 

因为上面服务是自动的。

重启电脑之后,再次访问,可以访问到,完美。

 

 

4.配置nexus和熟悉它

第一步,跟随着说明文档,看看下载nexus下来之后,有两个目录

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_19

nexus-3.5.2-01    安装目录

bin    包含nexus的启动脚本和相关配置      

etc    jetty、karaf等配置文件

jre    jre环境

lib    java架包库

public  关于nexus应用在本地跑起来所需要的资源

system  应用所有的插件和组件

LICENSE.txt 和 NOTICE.txt    版权声明和法律细则

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_20

 

sonatype-work\nexus3    数据文档

blobs/      创建blob的默认路径,如果你指定了绝对路径,那就不在这里了

cache/      当前缓存的karaf包的信息

db/        OrientDB数据库的数据,用于存储nexus的元数据的数据库

elasticsearch /    当前配置的Elasticsearch状态

etc/          大概是运行时配置状态和关于资源库的自定义的相关的东西

health-check/      看目录,健康检查的相关报告的存储目录吧

keystores/        自动生成的关于资源库的ID主键

log/            运行实例生成的日志文件,也有日志文件的压缩包,貌似是每天都会生成日志文件,你可以定期删除老的日志文件

tmp/            用于存储临时文件的目录

 

具体每个目录下的各个配置文件的作用,请参考官方文档说明:https://help.sonatype.com/display/NXRM3/Installation

 

如果你想配置nexus的应用在本地启动的JVM参数,可以在nexus.vmoptions

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_21

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_22

 

如果你想改变nexus的端口号,可以在nexus-default.properties

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_23

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_24

 

 

5.搭建maven私服资源库

由于现在使用的nexus3,所以在nexus应用上资源库初始化目录和nexus2有很大的不同,但是类型都是一样的。

第一步:首先http://localhost:8081/

登录上nexus,未登录的状态下是这样的。

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_25

使用默认用户名admin密码admin123登录后,如下

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_26

 

第二步:使用nexus3要搭建maven私服的核心功能

在nexus安装并启动之后,我大概的把整个nexus的官方说明文档走了一遍,主要就是介绍了左侧菜单中的各个功能模块。https://help.sonatype.com/display/NXRM3/Configuration

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_27

有兴趣去看看,还是很有帮助的。

====================================================================================================================

-------------------------------------------------------------------------------------普及-----------------------------------------------------------------------------------------------------------------

上面提到的一点,不管nexus版本是怎么样的,至少,repository的类型是一样的。

先看一下大概的目录结构:

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_28

根据多方的文档和别人的博客,再综合官网的解释,我就这样理解得出:

资源库也就是这么三种,如上图中  【代理资源库】【托管资源库】【组资源库】,其实名字就是我自己瞎起的。

具体解释一下:

【代理资源库】:就是配置了外网的maven远程仓库地址的资源库,本地找不到,就会通过代理资源库中的地址,找到远程仓库,从远程仓库中下载所需要的jar。

【托管资源库】:就是放在本地的资源库,零零散散的jar,从远程仓库中下不到,只能自己在网上找,找到jar下载下来,放在托管资源库中,交给nexus统一管理。不然哪天想去用连接数据库的jar包,还得自己翻磁盘,多麻烦。

【组资源库】 :从上面①+②看出来,其实组资源库中并没有jar包,而是把代理资源库和托管资源库统一配置到组资源库中,然后组资源库作为一个唯一的public提供给所有人使用。就像工人1+工人2把自己的账单统一给包工头,让包工头去跟老板结账是一个道理。

 

好,明确了这一点,开始往下看吧。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

如果你想直入主题,往下看。

①在创建 repository之前,还是需要先设定一个指定的文件存储目录,便于统一管理。

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_29

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_30

 由下面新建的完成的,可以看出,

 

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_31

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_32

 

②第二步,创建Proxy Repository  代理资源库

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_33

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_34

创建页面出来之后,页面上有三个input框是必填的:

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_35

 远程Maven地址:https://repo1.maven.org/maven2/

 

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_36

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_37

其他的不用更改了。保存就好了。

 

【注意】:我想建好几个proxy repository,以便于我可以加入更多的远程maven仓库到我的group 资源库中

唯一一点,就是你看你加入的proxy资源库哪个使用的是国内的maven仓库地址,哪个是国外的。

当然国内的要放在国外的之前。

这样的加入group资源库的顺序就是  hosted资源库>国内proxy资源库>国外proxy资源库

下面给出一些maven远程仓库的地址:

jboss的maven中央仓库地址:http://repository.jboss.com/maven2/

阿里云的maven中央仓库地址:http://maven.aliyun.com/nexus/content/groups/public/

apache的maven中央仓库地址:http://repo.maven.apache.org/maven2/

 

 

 

③第三步,创建hosted repository 托管资源库

Hosted有三种方式,Releases、SNAPSHOT、Mixed
Releases: 一般是已经发布的Jar包
Snapshot: 未发布的版本
Mixed:混合的

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_38

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_39

 

 

④第四步,创建group repository  组资源库

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_40

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_41

为什么要注意顺序??

官方文档中建议:

 It is recommended practice to place hosted repositories higher in the list than proxy repositories. For proxy repositories, the repository manager needs to check the remote repository which will incur more overhead than a hosted repository lookup.

希望将hosted repositories【托管资源库】的顺序放在proxy repositories【代理资源库】之前,因为一个group【组资源库】中可以涵括这些托管资源库和代理资源库。而一整个的group是作为一个public,一个接口给别人使用的。所以当查找架包的时候,如果代理资源库在前面,那就是先从远程去查找jar,而不是先从托管资源库(本地仓库)去查找是否有jar。这样访问外网的消耗比起来在本地查找,当然是将托管资源库放在代理资源库之前的优先位置了。

 

 

⑤第五步,比较nexus中默认提供的

好吧,从命名上也可以看出来,系统自带的命名可以看出来这个资源库是什么类型中的什么类型的。【没有创建未发布的资源库,那以后咱们自己想去创建的,自行创建,再加入到group中就行了】

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_42

 

如果你想,可以自己去创建一个新的admin,新的用户名,新的密码,新的权限。供下面使用。

 

6.让maven项目用到刚刚搭建的maven私服

==========================================================个人理解===============================================================

maven下的setting.xml文件和你自己项目中的pom.xml文件的关系:

    Ⅰ.settting.xml文件就是本地,电脑上的全局变量;而pom.xml文件就是局部变量。

    Ⅱ.自己创建的pom.xml文件肯定对于项目来说,优先使用的。然而pom.xml文件中如果没有指定jar要从哪里下载的话,也就是说没有配置镜像地址的话,当然只能去按照全局变量中定义的地址去找了

    Ⅲ.那怎么去找咱们的全局变量呢?其他人可能是直接在pom.xml文件中配置指定的方式。我是使用的IDE【编译工具】中直接指定确定的setting.xml文件,这样在pom.xml文件中没有的情况下,我的IDE就按照设定的去找对应的setting.xml文件去。

 

 

【注意】:有一点要注意的就是,maven如果是你自己下载的,那里面肯定会有一份setting.xml文件。什么都不配置的话,它全部都是按照默认值去干的,例如本地仓库它默认的就是放在用户/.m2/文件夹下的。

【忠告】:在修改setting.xml文件之前,先备份一份原始的。个人感觉里面的注释是非常有参考价值的。

 

下面开始解释具体的详细步骤:

 

最简单的使用方式:

①在原始的setting文件中加入

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_43

拷贝的这个地址,就是下面即将在setting.xml文件中添加时使用的。可以对应下面的setting.xml文件中看。

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_44

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

 

②按照教程,把IDE指定为这个setting.xml文件即可。

 

③在新建的maven项目中的pom.xml文件中,添加一个原本本地仓库中没有下载过的架包【新建maven项目的过程:】

 

你自己的项目中pom.xml文件并不需要改变什么东西,以前怎么用,现在还怎么用。

例如下面:

这是我新建的一个maven项目

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_45

 

 pom.xml文件中

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46

<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.sxd.testP</groupId>
  <artifactId>mavenProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
      <plugins>
          <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <configuration>
                  <version>3.1</version>
              </configuration>
          </plugin>
      </plugins>
  </build>
  
  <!-- 这一段是新添加的,这一段之外的都是创建maven项目时,它自己生成的pom.xml文件框架 -->
  <dependencies>
      
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>
        
  </dependencies>
  
  <!-- 这一段结束 -->  
  
</project>

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46

 

然后保存pom.xml文件之后,

在本地仓库中

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_50

 

 这个就算你不建私服,只要指定了本地仓库自定义的地址,一般都会下载成功的。

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_51

 

下面看看私服中是否有这个东西

http://localhost:8081/    admin、admin123登录进入[不登陆也可以搜索,这看你自己会给游客这种角色分配什么样的权限了]

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_52

点开查看:

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_53

点进入jar包的这个概要信息

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_54

 

 

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_55

查找发现,后面的那一串应该类似于UUID的字符串 可以查找到  

原来nexus把下载下来的所有文件都转化成了byte文件。这也难怪在上面创建

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_56

是使用的blob这个单词。二进制的意思吧!!!

 

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_57

 

 

 

 

=========================================================================================================================================

至此,maven私服搭建,以及使用maven项目使用maven私服已经全部连通。

如果想看详细的配置的话,可以在GitHub上查看:https://github.com/sonatype/nexus-book-examples

=========================================================================================================================================

7.使用界面上传jar到nexus 和命令上传第三方jar到nexus

首先创建第三方仓库3rd-party,选择mixed version policy c才可以界面上传

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_58

使用upload 菜单上传

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_59

 

下面是 命令方式上传

最后的最后,就是还有一部分,咱们没有走。

使用nexus2的话,可以在界面上直接上传第三方的jar到上创建的hosted资源库,也就是托管资源库中。

使用命令上传第三方jar到nexus了。

 

示例:

上传一个处理word的jar包到nexus上。

jar包为jacob

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_60

我们先在nexus上搜索一下:下面是搜不出来的

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_61

 

 

步骤1:

把hosted资源库,也配置到maven的settting.xml文件中

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_62

添加下面:

<!--id自定义,但是在使用命令上传的时候会用到-->
<server>  
        <id>myself_hosted</id>  
        <username>admin</username>  
        <password>admin123</password>  
 </server>

到目前为止,我的settting.xml文件也就是下面这些东西

 

 

 步骤2:

 使用

以下命令

mvn deploy:deploy-file -DgroupId=sxd.jar -DartifactId=jacob -Dversion=1.18 -Dpackaging=jar -Dfile=G:\jar\jacob-1.18.jar -Durl=http://localhost:8081/repository/myself_hosted/ -DrepositoryId=myself_hosted

命令解释:

-DgroupId=sxd.jar                           自定义
-DartifactId=jacob                          自定义
-Dversion=1.18                            自定义  三个自定义,构成pom.xml文件中的坐标
-Dpackaging=jar                           上传的类型是jar类型
-Dfile=G:\jar\jacob-1.18.jar                   jar的本地磁盘位置
-Durl=http://localhost:8081/repository/myself_hosted/    hosted资源库的地址,下图中
-DrepositoryId=myself_hosted                   setting.xml文件中配置的ID

 

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_63

 

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_64

 

 上传完成,再nexus中查看一下:

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_65

 

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_66

 

上传成功!!!

步骤3:

在项目的pom.xml文件中引入一下jar包

<dependency>
            <groupId>sxd.jar</groupId>
            <artifactId>jacob</artifactId>
            <version>1.18</version>
            <scope>provided</scope>
        </dependency>

保存pom.xml文件。

这下,发现maven下已经引入成功。并且已经将这个jar包放入本地maven仓库了。

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_67

 

完全成功了。

 

==========================================================================================================================================================

 这个整个的过程,花费了一个周末+2天的时间!

==========================================================================================================================================================

附赠:如果上面的方法失败,可以使用这个方法上传已经存在的第三方jar包到本地maven仓库

 

例如我的本地有几个第三方的jar,你想直接上传本地的maven仓库

1.有几个第三方的jar

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_68

 

2.编辑上传命令install

导入第三方jar的命令

mvn install:install-file -Dfile=D:\document\IdeaProjects\myTestDocument\jar\transaction-springcloud-4.2.0-SNAPSHOT.jar -DgroupId=com.codingapi -DartifactId=transaction-springcloud -Dversion=4.2.0-SNAPSHOT -Dpackaging=jar

导入第三方pom文件的命令【留作参考】

mvn install:install-file -Dfile=D:\document\IdeaProjects\myTestDocument\jar\tx-lcn-4.2.0-SNAPSHOT.pom -DgroupId=com.codingapi -DartifactId=tx-lcn -Dversion=4.2.0-SNAPSHOT -Dpackaging=pom

 

maven 上传外部jar包到私服windows maven仓库上传jar包_资源库_69

 

 

3.上传完成后,可以将source的jar直接拷贝到maven仓库中

本地maven仓库中展示已经上传成功的jar目录

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_70

将source 直接拷贝到此处即可【如果没有source就算了】

 

maven 上传外部jar包到私服windows maven仓库上传jar包_maven_71

 

 4.最后,就可以在自己的项目中引用了

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46

<dependency>
            <groupId>com.codingapi</groupId>
            <artifactId>transaction-springcloud</artifactId>
            <version>4.2.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.codingapi</groupId>
            <artifactId>tx-plugins-db</artifactId>
            <version>4.2.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46

maven 上传外部jar包到私服windows maven仓库上传jar包_xml文件_46