基于本地仓库搭建nexus私服

Posted ac_dao_di

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于本地仓库搭建nexus私服相关的知识,希望对你有一定的参考价值。

1. 前言

    在公司里运行工程代码顺风顺水,离职后,你可能有公司的部分代码,但是打开工程,满屏标红,看着是不是很难受?有没有办法不标红呢?当然是有的,只需要搭建自己的私服即可,慢慢看完下面你就知道怎么做了。

2. nexus安装

    从nexus官网下载一个免费版本的tar:https://www.sonatype.com/products/repository-oss-download,需要填写公司邮箱才能下载。

    下载完成后,解压nexus-3.37.0-01-mac.tgz并启动nexus。终端显示:Starting nexus,表示启动成功

/Users/jessin/Downloads/nexus-3.37.0-01-mac/nexus-3.37.0-01/bin/nexus start

    访问:http://localhost:8081/,即可看到nexus启动,本人把匿名账号给关闭了:


    由于maven中央仓库太慢了,这里配置一些国内的仓库代理加速访问,优先使用国内仓库代理获取外网jar。登陆管理员admin账号后(http://localhost:8081/#admin/repository/repositories
),配置阿里和华为云仓库,这里是proxy类型的仓库。

  • 阿里:https://maven.aliyun.com/repository/public
  • 华为:https://mirrors.huaweicloud.com/repository/maven/

注意nexus中有三种类型的仓库:

  • proxy, 代理仓库,数据从代理接口获取,这里阿里、华为、中央仓库均是外网代理仓库。
  • hosted,私服仓库,也就是自己部署的release和snapshot包,nexus默认创建了两个仓库:maven-releases和maven-snapshots.
  • group,组合仓库,可以将proxy/hosted类型仓库组合成自己的仓库,有先后顺序,nexus默认创建了maven-public作为组合仓库。

    添加到maven_public仓库中:

    使用私服,需要修改maven settings.xml配置,将所有的jar查询均拦截为走私服地址:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

<localRepository>/Users/jessin/Documents/Documents/Program/tmp_localRepository</localRepository>
  <mirrors>

        <mirror>
            <!--This sends everything else to /public -->
            <id>nexus</id>
            <mirrorOf>*</mirrorOf>
            <url>http://localhost:8081/repository/maven-public/</url>
        </mirror>
    </mirrors>
    <servers>
        <server>
            <id>nexus</id>
            <username>admin</username>
            <password>nexus登陆密码</password>
        </server>
    </servers>
</settings>

3. 上传单个jar到私服

    方法一:nexus界面上传jar:

    方法二:基于maven deploy-file插件上传到nexus

参数原理
-DpomFile 指定jar的坐标,不然需要自己指定-DgroupId/artifactId/version
-Dfile. 指定上传的jar路径
-DrepositoryId 指定nexus id主要用于定位上传需要的用户名和密码,跟maven settings.xml中server id保持一致即可。
-Durl url必须是一个hosted类型的仓库,不能是proxy/group类型,否则会报405。一般是maven-releases/maven-snapshots,也可以自己新建一个hosted 仓库。

/Users/jessin/Downloads/apache-maven-3.8.1/bin/mvn deploy:deploy-file -DpomFile=/Users/jessin/Documents/Documents/Program/localRepository/com/practice/jessin/abcp.api/1.0.22/abcp.api-1.0.22.pom -Dfile=/Users/jessin/Documents/Documents/Program/localRepository/com/practice/jessin/abcp.api/1.0.22/abcp.api-1.0.22.jar -DrepositoryId=nexus -Durl=http://localhost:8081/nexus/content/repositories/maven-releases

    参考:
https://www.cnblogs.com/sos-blue/p/5833239.html

4. 批量脚本

    对于本地仓库,有大量的jar需要上传,依靠界面上传费时费力,需要有一个批量的脚本。
    而本地仓库中既有poml类型的jar,有 release jar和snapshot jar,如果全部上传到maven-release必然会报错,因为release仓库不允许上传snapshot包,批量脚本需要考虑这种情形。而且,如果一个jar包有关联的source源码包,我们也期望能够关联起来并上传到私服,方便后续查看源码。另外整个本地仓库除了之前公司自己的jar,还有其他公网仓库的jar,公网仓库的jar随时随地可以获取到,但是私有仓库的jar就不一定了,这里支持按照关键字(groupId)过滤某些jar并上传到私服。

    因此,批量脚本需要实现如下功能点:

  • 将本地仓库中路径含有keyword的jar全部过滤出来上传
  • release上传到maven-releases仓库
  • snapshot上传到maven-snaphsot仓库,
  • 只有pom文件的只上传pom到maven-releases仓库
  • 如果有source包可以关联上。

    见仓库:https://github.com/jessin20161124/mybash

#!/bin/sh

# Reference: http://roboojack.blogspot.in/2014/12/bulk-upload-your-local-maven-artifacts.html

if [ "$#" -ne 4 ] || ! [ -d "$1" ]; then
    echo "Usage:"
    echo "       bash run.sh <repoRootFolder> <repositoryId> <repositoryUrl>"
    echo ""
    echo ""
    echo "       Where..."
    echo "       repoRootFolder: The folder containing the repository tree."
    echo "                       Ensure you move the repository outside of ~/.m2 folder"
    echo "                       or whatever is configured in settings.xml"
    echo "       repositoryId:   The repositoryId from the <server> configured for the repositoryUrl in settings.xml."
    echo "                       Ensure that you have configured username and password in settings.xml."
    echo "       repositoryUrl:  The URL of the repository where you want to upload the files."
    echo "       keyword:  The keyword of the path where you want to filter the files."
    exit 1
fi

while read -r line ; do
	if ! [[ $line =~ $4 ]]; then
		continue
	fi
	url=$3
	if [[ $line =~ SNAPSHOT ]]; then
           #for snaphost ,replace with snapshot repository
	   url=$url/%releases/snapshots
	   echo $url	
	fi
    	echo "Processing file $line"

    pomLocation=$line/./
    pomLocation=$PWD$pomLocation/jar/pom
    jarLocation=$line/./
    jarLocation=$PWD$jarLocation/pom/jar
    sourceLocation=$line/./
    sourceLocation=$PWD$sourceLocation/.pom/-sources.jar
#    echo $pomLocation
 #   echo $jarLocation
#echo $sourceLocation
    if [[ -e $jarLocation ]] && [[ -e $sourceLocation ]]; then
	echo "both exist"	
    /Users/jessin/Downloads/apache-maven-3.8.1/bin/mvn deploy:deploy-file -DpomFile=$pomLocation -Dfile=$jarLocation -Dsources=$sourceLocation  -DrepositoryId=$2 -Durl=$url
    elif [[ -e $jarLocation ]]; then
		
	echo "jar exist"	
    /Users/jessin/Downloads/apache-maven-3.8.1/bin/mvn deploy:deploy-file -DpomFile=$pomLocation -Dfile=$jarLocation  -DrepositoryId=$2 -Durl=$url
    elif [[ -e $sourceLocation ]]; then

	echo "source exist"	
    /Users/jessin/Downloads/apache-maven-3.8.1/bin/mvn deploy:deploy-file -DpomFile=$pomLocation -Dsources=$sourceLocation  -DrepositoryId=$2 -Durl=$url
    else
	
	echo "pom exist"	
    /Users/jessin/Downloads/apache-maven-3.8.1/bin/mvn deploy:deploy-file -DpomFile=$pomLocation -Dfile=$pomLocation  -DrepositoryId=$2 -Durl=$url
    fi
done < <(find $1 -name "*.pom")

    运行命令如下,需要注意上传的仓库与本地maven的仓库区分开来,不被扫描到,最好单独拷贝一个目录出来,否则可能报错,因为deploy过程中会先install到本地。

bash   upload.sh ./Documents/Documents/Program/localRepository nexus http://localhost:8081/repository/maven-releases jarslink-api

    上传源码包后,就算离职了,也可以正常查看前司老代码了。。

5. nexus docker镜像

    将所有jar上传到docker nexus,下次可以直接部署,无需重新构建nexus啦。

以上是关于基于本地仓库搭建nexus私服的主要内容,如果未能解决你的问题,请参考以下文章

基于本地仓库搭建nexus私服

基于本地仓库搭建nexus私服

Nexus搭建自己的Maven私服

私服仓库 nexus 环境搭建(win10)

ubuntu下使用Nexus搭建Maven私服

snaptype nexus搭建maven私服仓库