总结:使用Sonatype Nexus搭建私有maven仓库

Nexus Repository OSS 3.X 官网快捷下载这个可能会变动,下面两个应该不怎么变动;
Download Nexus Repository OSS 3.X
Download Nexus Repository OSS 2.X
官方教程 这样有解释 repository 、proxy、 group 3种类型的搭建方法;

我这里是在mac系统下操作的,其他系统也可以参考,Nexus Repository OSS 已经设计的挺简单的了,高级的反正我也没学会。

下载完成,解压,可以看到如下的目录结构;

总结:使用Sonatype Nexus搭建私有maven仓库_第1张图片
目录结构

1:nexus 可运行程序是启动,和关闭 nexus的脚本程序;
2:上面有两个properties文件是用来修改配置的,比如端口,主机ip等;


总结:使用Sonatype Nexus搭建私有maven仓库_第2张图片
properies

第一个文件上面注明了:不要让我们编辑,而是去编辑$data-dir/etc/nexus.properties 这个文件,应该是下面的properties文件;

运行nexus

mac 环境下:使用命令窗口,打开到nexus 所在目录,比如我这里的:


总结:使用Sonatype Nexus搭建私有maven仓库_第3张图片
image.png
//运行试试,可以看到 nexus 只有这几个操作可以执行
➜  bin nexus
Usage: nexus {start|stop|run|run-redirect|status|restart|force-reload}
➜  ~ nexus start 
Starting nexus
//到这里,nexus 就已经启动好了

如果你想每次启动nexus 更方便些(无需进入到nexus 所在目录去执行nexus命令),就需要配置下path;

我这里配置到的是 .zshrc 文件下(请参考有用部分NEXUS_ROOT,其他请忽略)
NEXUS_ROOT=/Users/xpath/nexus-3.15.2-01-mac/nexus-3.15.2-01/bin

PATH=$GROOVY_ROOT:$NDK_ROOT:$DART_ROOT/bin:$FLUTTER_ROOT/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$NEXUS_ROOT:$PATH:

======================上面是配置的内容======================
======================下面是执行的步骤======================
➜  ~ vim .zshrc 
➜  ~ source .zshrc 
➜  ~ nexus 
Usage: /Users/xpath/nexus-3.15.2-01-mac/nexus-3.15.2-01/bin/nexus {start|stop|run|run-redirect|status|restart|force-reload}
➜  ~ nexus start 
Starting nexus
➜  ~ nexus stop
Shutting down nexus
nexus is not running.
➜  ~ nexus start
Starting nexus
➜  ~ pwd
/Users/xpath

接下来,我们可以打开页面试试,看看部署在我们电脑上的nexus.

查看部署在本机的nexus

1:使用电脑浏览器打开 http://localhost:8081/ (参数的意义,前面properties文件有解释)

总结:使用Sonatype Nexus搭建私有maven仓库_第4张图片
nexus welcome 页面

2:登录
默认登录账号:admin
默认登录密码:admin123

登录之后:就有设置选项了


总结:使用Sonatype Nexus搭建私有maven仓库_第5张图片
登录之后

创建自己的Repository

1:点击Create repository ;
2:选择要创建的类型;这里选择maven(hosted)


总结:使用Sonatype Nexus搭建私有maven仓库_第6张图片
选择类型

proxy:是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用;
Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted里;
Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了右边那个Repository Path可以点击进去,看到仓库中artifact列表。不过要注意浏览器缓存。


总结:使用Sonatype Nexus搭建私有maven仓库_第7张图片
创建的大概配置

到这里服务器部分的工作就已经完成了。接下来就是往这个仓库推东西了;

Android项目使用gradle-mvn-push

场景:我们需要对一个model提交到maven库;。
1:工程目录添加gradle-mvn-push.gradle文件;可以参考;
2:对应的子module apply gradle-mvn-push.gradle该文件。

apply from: "../gradle-mvn-push.gradle"

3:根据gradle-mvn-push.gradle 修改gradle.properties配置文件;
后面是文件的内容:

//gradle-mvn-push.gradle
apply plugin: 'maven'
apply plugin: 'signing'

def sonatypeRepositoryUrl

def isReleaseBuild() {
   return VERSION_NAME.contains("SNAPSHOT") == false
}

def getReleaseRepositoryUrl() {
   return hasProperty('nexusUrl') ? "${nexusUrl}/content/repositories/releases"
           : "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}

def getSnapshotRepositoryUrl() {
   return hasProperty('nexusUrl') ? "${nexusUrl}/content/repositories/snapshots"
           : "https://oss.sonatype.org/content/repositories/snapshots/"
}


if (isReleaseBuild()) {
   println 'RELEASE BUILD'
   sonatypeRepositoryUrl = "${nexusUrl}/content/repositories/releases"
} else {
   println 'SNAPSHOT BUILD'
   sonatypeRepositoryUrl = "${nexusUrl}/content/repositories/snapshots"

}

def getRepositoryUsername() {
   return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}

def getRepositoryPassword() {
   return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}

afterEvaluate { project ->
   uploadArchives {
       repositories {
           mavenDeployer {
               beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
               pom.artifactId = POM_ARTIFACT_ID
               pom.version = VERSION_NAME
               pom.groupId = GROUP
               repository(url: sonatypeRepositoryUrl) {
                   authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
               }

               pom.project {
                   name POM_NAME
                   packaging POM_PACKAGING
                   description POM_DESCRIPTION
                   url POM_URL

                   licenses {
                       license {
                           name POM_LICENCE_NAME
                           url POM_LICENCE_URL
                           distribution POM_LICENCE_DIST
                       }
                   }

                   developers {
                       developer {
                           id POM_DEVELOPER_ID
                           name POM_DEVELOPER_NAME
                       }
                   }
               }
           }
       }
   }

   signing {
       required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
       sign configurations.archives
   }

   if (project.hasProperty("android")) { // Android libraries
       task sourcesJar(type: Jar) {
           classifier = 'sources'
           from android.sourceSets.main.java.srcDirs
       }

       task javadoc(type: Javadoc) {
           source = android.sourceSets.main.java.srcDirs
           classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
       }
   } else { // Java libraries
       task sourcesJar(type: Jar, dependsOn: classes) {
           classifier = 'sources'
           from sourceSets.main.allSource
       }
   }

   task javadocJar(type: Jar, dependsOn: javadoc) {
       classifier = 'javadoc'
       from javadoc.destinationDir
   }

   artifacts {
       archives javadocJar
       archives sourcesJar
   }
}
VERSION_NAME=1.0.0
POM_ARTIFACT_ID=UI
nexusUrl=http://localhost:8081/repository/UI
POM_NAME=YOU_POM_NAME
POM_PACKAGING=aar
POM_DESCRIPTION=An android hybrid Library
POM_URL=https://pom.url
GROUP=com.youGroup.android
POM_LICENCE_NAME=xxxx Privicy License
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID= developer id
POM_DEVELOPER_NAME = developer name
NEXUS_USERNAME=admin //这个和nexus登录账户一致
NEXUS_PASSWORD=admin123 //这个和nexus登录密码一致

设置好如上配置我们就可以推送我们代码了;
2种方式:
1:使用Android studio 自带的gradle 图形界面开启推送任务;


总结:使用Sonatype Nexus搭建私有maven仓库_第8张图片
image.png

2:自己使用gradle 命令执行任务推送;

 XXXDemo git:(master) ✗ gradlew :submodule name:uploadArchives
//推送成功之后的日志
Could not find metadata com.xxxx.android:webview/maven-metadata.xml in remote (http://localhost:8081/repository/UI/content/repositories/releases)

BUILD SUCCESSFUL in 1s
26 actionable tasks: 1 executed, 25 up-to-date

我们在回到nexus的图形界面


总结:使用Sonatype Nexus搭建私有maven仓库_第9张图片
推送上传成功之后

总结:使用Sonatype Nexus搭建私有maven仓库_第10张图片
image.png

代码是已经上传成功了,但是具体存储在本地哪里呢?

1:默认会放在~/.m2/repository目录下
2 更改配置用户范围的本地仓库:(如下是摘录来的,默认还是改的好)
先在/.m2/目录下创建settings.xml文件,然后在~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址


  
  你想要设置的路径
 
  

1.2 更改配置全局范围的本地仓库:
在M2_HOME/conf/settings.xml中更改配置,更改配置的方法同上
注:此时更改后,所有的用户都会受到影响,而且如果maven进行升级,那么所有的配置都会被清除,所以要提前复制和备份M2_HOME/conf/settings.xml文件;
故:一般情况下不推荐配置全局的settings.xml

使用私有库

buildscript {
    repositories {
        maven { url "http://localhost:8081/nexus/content/repositories/releases"}
//url "http://localhost:8081/nexus/ 基本固定,取决于服务器ip
//content/repositories/releases 取决于GroupID ,可以在选中要依赖的包查看;
    }
    ...
}

allprojects {
    repositories {
        maven { url "http://localhost:8081/nexus/content/repositories/releases"}
    }
}

后面的任务就是找一台机器,真正部署下试试了

你可能感兴趣的:(总结:使用Sonatype Nexus搭建私有maven仓库)