进入Nexus 官网下载页面:https://www.sonatype.com/download-oss-sonatype ,找到 Nexus Repository Manager OSS 2.x
字样,点击 nexus-2.14.1-01-bundle.zip
链接下载。
解压 nexus-2.14.1-01-bundle.zip
到任意路径,例如 D:\Apps\DevApps\snaptype-nexus\
,为行文方便,下文用 %NEXUS_HOME%
代指该路径。
进入 %NEXUS_HOME%\nexus-2.14.1-01\bin\jsw\
目录,这里是一系列以操作系统类型命名的文件夹,各文件夹下存放的是对应的 Nexus 脚本(Nexus 是这么设计目录的,但是,当前 Nexus 只提供了 Windows 的脚本)。
我这里进入 windows-x86-64
文件夹,以管理员身份运行 install-nexus.bat
和 start-nexus.bat
。
进入 http://localhost:8081/nexus 访问 Nexus 。
成功打开上述页面,表示安装完成
登录后,点击右侧菜单栏Views/Respositories->Respositories,将会看到下图几个仓库。
我这里并没有打算讲怎么新建仓库,因为nexus提供的这几个仓库对于简单使用已经可以了。
有的时候你确实需要等一等,因为我遇到过,怎么也没有索引下载下来,大概我吃了午饭回来,发现它自己下载好了。
现在你可以尝试在右侧菜单栏的搜索框尝试搜索内容。如果你的proxy仓库成功的下载了索引,我们尝试搜索okhttp(你也可以换个关键字)你将会看到如下面的画面
自带仓库Releases、Snapshots就是为我们准备的上传我们自己lib文件的仓库,所以就不必新建其它仓库了
配置仓库组Public Repositories。如下图配置好后,千万要点save进行保存。
仓库组与仓库就像我们android开发中ViewGroup 与 View的关系。本身包含其他仓库,对外又像仓库一样使用。
在我们项目的主build.gradle中修改allprojects的maven地址:
allprojects {
repositories {
//jcenter()
maven {url "http://ip:8081/nexus/content/groups/PublicSnapshots/"}
}
}
"sync now"一下,现在我们的工程配置的依赖就已经使用我们自己搭建的私有仓库了。
上图中Public Snapshots库对应的Respository Path就是我们上方替换默认maven库地址的私库地址。下面Releases、Snapshots库地址就是我们下节发布到私服 上传脚本中自己的lib库要发布到的仓库地址。
二、发布源码到私服
接下来,我们将在Android Studio环境下,来发布我们自己的库文件
1.在我们的工程下新建一个lib,我这就叫likelib吧。
2.在主项目下新建一个maven_push.gradle来写我们的发布到maven库的脚本
// The Maven plugin adds support for deploying artifacts to Maven repositories. // 一个可以让你把库上传到maven仓库的插件 apply plugin: 'maven' // The signing plugin adds the ability to digitally sign built files and artifacts. These digital signatures can then be used to prove who built the artifact the signature is attached to as well as other information such as when the signature was generated. // 对库文件进行数字签名的插件,可以通过签名知道谁创建了这个库文件,签名的时间等等信息 apply plugin: 'signing' // 声明变量记录maven库地址 def mavenRepositoryUrl // 判断是发布到正式库,还是snapshots库 if (isReleaseBuild()) { println 'RELEASE BUILD' // 下面的库地址指向的是我们私有仓库的Releases 仓库 mavenRepositoryUrl = hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL : "http://IP:8081/nexus/content/repositories/releases/" } else { println 'SNAPSHOTS BUILD' // 下面的库地址指向的是我们私有仓库的snapshots 仓库 mavenRepositoryUrl = hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL : "http://IP:8081/nexus/content/repositories/snapshots/" } // NEXUS_USERNAME等变量在我们主项目的gradle.properties中可以找到 def getRepositoryUsername() { return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : "" } def getRepositoryPassword() { return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : "" } // 根据我们在likelib下gradle.properties中声明的版本名称,来分辨是Release版本还是 snapshots版本 def isReleaseBuild() { return !VERSION_NAME.contains("SNAPSHOT"); } //"afterEvaluate是什么鸟?你可以理解为在配置阶段要结束,项目评估完会走到这一步。" 引用自http://jiajixin.cn/2015/08/07/gradle-android/ afterEvaluate { project -> // 我们声明我们要执行的上传到maven的task uploadArchives { repositories { mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } // 我们类比下compile com.squareup.okhttp:okhttp:2.7.0 // artifactId 对应com.squareup.okhttp; groupId 对应okhttp;version对应2.7.0 // 这样就类似坐标的方式定位到了制定的库文件 pom.artifactId = POM_ARTIFACT_ID pom.groupId = POM_GROUP_ID pom.version = VERSION_NAME // 授权验证,这里也就是你登陆搭建的私服服务器时候的用户名\密码 repository(url: mavenRepositoryUrl) { authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) } // 这里是配置我们maven库需要的pom.xml文件的各个内容,具体意思我们在主目录gradle.properties中解释 pom.project { name POM_NAME packaging POM_PACKAGING description POM_DESCRIPTION url POM_URL scm { url POM_SCM_URL connection POM_SCM_CONNECTION developerConnection POM_SCM_DEV_CONNECTION } 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 } // type显示指定任务类型或任务, 这里指定要执行Javadoc这个task,这个task在gradle中已经定义 task androidJavadocs(type: Javadoc) { // 设置源码所在的位置 source = android.sourceSets.main.java.sourceFiles } // 生成javadoc.jar task androidJavadocsJar(type: Jar) { // 指定文档名称 classifier = 'javadoc' from androidJavadocs.destinationDir } // 生成sources.jar task androidSourcesJar(type: Jar) { classifier = 'sources' from android.sourceSets.main.java.sourceFiles } // 产生相关配置文件的任务 artifacts { archives androidSourcesJar archives androidJavadocsJar } }
3.在主项目下gradle.properties中来声明我们运行脚步时需要的信息
# properties for maven2 repository # nexus服务器登陆时候的用户名/密码 NEXUS_USERNAME=admin NEXUS_PASSWORD=admin123 # 在POM文件中使用的group ID POM_GROUP_ID=com.exmaple.like # POM文件中指向你网站的地址 POM_URL=https://github.com/achenglike # SCM是指版本管理工具,一下说他的相关信息 POM_SCM_URL=https://github.com/ POM_SCM_CONNECTION=https://github.com/achenglike POM_SCM_DEV_CONNECTION=https://github.com/achenglike # 你的开放协议相关信息 POM_LICENCE_NAME= Apache License Version 2.0 POM_LICENCE_URL= https://github.com/achenglike/Gallery/blob/master/LICENSE POM_LICENCE_DIST=Apache License Version 2.0 # 开发者的相关信息 POM_DEVELOPER_ID=achenglike POM_DEVELOPER_NAME=achenglike
3.在我们likelib项目下的build.gradle引入我们的脚本
apply from: './maven_push.gradle'
4.在我们likelib项目下新建一个gradle.properties来存我们需要发布的版本、格式等信息
# 库名称 POM_NAME=Like Library # artifactId POM_ARTIFACT_ID=like # 库的打包格式为aar, 常见的还有jar POM_PACKAGING=aar # 库的描述,说明他是干啥的 POM_DESCRIPTION=like Library # 要发布的版本好,snapshots 版本可以使用格式 1.0.0-SNAPSHOT VERSION_NAME=1.0.0
5.我们现在可以在android studio的Terminal中来发布我们的库文件了 。
输入命令:
// windows gradlew uploadArchives // macOS ./gradlew uploadArchives
运行结束Terminal会提示成功或失败,提示成功说明已经上传到了你的私库中。
如果没有意外,我们已经发布到了我们的私有仓库,我们可以自己去看看,就像下面的图。
发布jar文件到私服
选中release仓库,选择【Artifact Upload】,输入相关信息,添加jar包,点击【Add Artifact】,最后点击【Upload Artifact】完成上传。
二、Gradle 引用
1,获取仓库和Jar包信息
在【Summary】中找到仓库URL,或者是【Repository Path】
在【Browse Index】中找到对应文件,查看右边【Maven】的相关信息(groupId, artifactId, version)
接下来我们将使用我们上传的库文件
1.在app 模块的build.gradle中引入依赖
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.0' compile 'com.android.support:design:23.2.0' compile 'com.exmaple.like:like:1.0.0' }
最下面的库引用就是我们刚才上传的库文件
2.我们在app模块使用依赖的库
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, Hello.getInstance().hello(), Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); }
参考: https://www.jianshu.com/p/b1fe26d5b8c8;
https://www.jianshu.com/p/207c3a467167;