一、前言
如果我们有多个项目要使用到同一份代码(框架、工具或自定义控件),可以把这份代码写成
Android Library
,然后把Android Library打成aar
包上传到Maven
仓库,其他的项目只需要依赖
这个包就可以使用。当有需要修改这份内容的时候,只需要改这一份即可。如果希望将项目开源出去的话可以把包发布到
JCenter
仓库中;而如果只是在公司内部使用,则在公司内部搭建私有Maven仓库
即可。Maven和SVN、Git的区别是:都是
远程代码托管仓库
,SVN和Git更着重代码的差异对比
,而Maven着重于项目管理
。
二、初步项目的结构
在本次的文章中,我会用一个App去依赖Library包,并且在App中调用Libray包的Toast方法,通过本地Maven仓库
和JCenter仓库
两种方式实现远程依赖Library包。希望从中学习:
- Maven环境的搭建
- Maven仓库的使用
- 发布开源项目到JCenter。
2.1 初步代码的具体内容
2.1.1 共享Library的代码
mylibrary 模块在创建的时候选择为Android Library
类型,在里面添加了ToastUtils
类,提供吐司的功能。
/**
* 吐司工具类,提供给其他module使用
*/
public class ToastUtils {
public Context mcontext;
public ToastUtils(Context context) {
mcontext = context;
}
/**
* 这是一个吐司,没有特别的功能,只是测试
* @param s 吐司的字符串
*/
public void ToastShort(String s) {
Toast.makeText(mcontext, s, Toast.LENGTH_SHORT).show();
}
}
2.1.2 去引用共享模块
app
是和mylibrary
在同一Project
下,在app/build.gradle
文件中添加依赖代码。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
//对,就这一句。依赖mylibrary
implementation project(':mylibrary')
}
接下来就在app
中去调用mylibrary
模块下的代码,看看有没效果。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//神奇的发现 真的可以引用到
ToastUtils toastUtils = new ToastUtils(this);
toastUtils.ToastShort("哈哈哈哈");
}
}
2.1.3 代码执行效果
效果就是吐司成功显示,图片就不放了。而且被引用Library
还能被多个module
使用,非常方便。
三、配置Nexus环境
3.1下载Nexus
- 官网地址:下载地址
3.2 安装Nexus
- 1.将刚刚下载解压到目录,解压后会有两个目录:
- sonatype-work(工作目录)
- nexus-3.15.2-01(安装文件目录)
- 2.接下来切换到
nexus-3.2.1-01/bin
目录下,Shift键+右键鼠标,点击从此处打开命令窗口
。
- 3.输入
nexus.exe/run
回车,执行后出现以下信息表示安装成功
- 4.在浏览器中输入
localhost:8081
,就完成了配置nexus。
- 5.登录访问nexus,默认登录账号和密码是
admin
和admin123
- 6.Nexus的默认端口为
8081
,想修改默认端口可打开\nexus-3.15.2-01\etc
目录下的nexus-default.properties
文件,修改为想要的端口号即可。
3.3 遇到的问题
在搭建Nexus
期间出现了一个异常,使用初始账号密码admin
和admin123
一直登不上。
解决方法:问题就是无法连接到服务器,在Google找到类似的帖子,于是我把sonatype-work
这个工作目录
删掉,重新在命令窗口中安装Nexus。结果再次输入账号密码就成功了!
四、部署代码到Maven
4.1简述步骤:
- 第一步:在
mylibrary
的build.gradle
文件的最底部添加脚本代码; - 第二步:创建
gradle-mvn-push.gradle
脚本文件。 - 第三步:在
gradle-mvn-push.gradle
中填写脚本信息; - 第四步:执行
Task
任务。 - 第五步:为app项目修改
依赖
的代码。 - 第六步:
引用
依赖包中的方法,查看代码提示文本。
4.2具体步骤
- 第一步:在
mylibrary
的build.gradle
文件的最底部添加脚本代码,表明引用这个脚本路径。
apply plugin: 'com.android.library'
android {
...
}
dependencies {
...
}
//引入这个文件脚本
apply from: rootProject.file('mylibrary/gradle-mvn-push.gradle')
- 第二步:在
mylibrary
的build.gradle
文件的同层路径下新建gradle-mvn-push.gradle
脚本文件。
- 第三步:填写脚本信息,在
gradle-mvn-push.gradle
脚本uploadArchives
里面配置好一些信息,比如项目名称、存储路径、版本号、登录密码。随后AndroidStudio会将编译后的java文件
和资源文件
打包成arr
包。
//发布到私有服务器maven仓库
apply plugin: 'maven'
//生成文档注释
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath = files(android.bootClasspath)
destinationDir = file("../javadoc/")
options.encoding = "utf-8"
options.charSet = "utf-8"
failOnError false
}
//将文档打包成jar
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
//打包main目录下代码和资源的 task
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
//配置需要上传到maven仓库的文件
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
//是一个发布类库到中央仓库的Task,我们需要为它指定本地仓库路径以及类库的一些信息
uploadArchives {
repositories {
mavenDeployer {
//指定maven仓库url
repository(url: "http://localhost:8081/nexus/content/repositories/releases/") {
//nexus登录默认用户名和密码
authentication(userName:"admin", password: "admin123")
}
// 这里是配置我们maven库需要的pom.xml文件的各个内容
pom.project {
groupId "com.x.songsong"// 唯一标识(通常为模块包名,也可以任意)
artifactId "appregister" // 项目名称(通常为类库模块名称,也可以任意)
version "1.0.0" // 版本号
}
}
}
}
-
第四步:执行Task任务,也就是把刚刚的配置提交。方法有两种:
(1)双击uploadArchives
文件去执行;
(2)在Terminal
命令行里执行gradlew uploadArchives
。
代码复制:gradlew uploadArchives
等待BUILD SUCCESSFUL
后,就可以在浏览器中看到仓库中发布成功的依赖包。跟我们配置的一样,其中的文件有javadoc
、sources
、arr
、pom
这四种,他们分别代表编译后的java文件
、java源码
、Android Library格式文件
、配置文件
。
- 第五步:为app项目修改依赖的代码:
(1)修改项目根目录下的build.gradle中添加:
allprojects {
repositories {
google()
jcenter()
maven {
url "http://localhost:8081/nexus/content/repositories/releases/"
}
}
}
(2)在app模块build.gradle中添加依赖
//implementation project(':mylibrary')
implementation 'com.x.songsong:appregister:1.0.0'
- 第六步:引用依赖包中的方法,并且能在提示信息中显示出中文,并且没有乱码。
五、发布到JCenter仓库
JCenter
是由Bintray
维护的一个仓库,若想发布项目到JCenter
,首先需将项目上传到Bintray
。
- 第一步:Bintray网站注册,保存API Key。
- 第二步:在AS中配置bintray-release用于上传到远程仓库。
- 第三步:上传到Bintray中。
- 第四步:提交审核。
具体参考网站:https://blog.csdn.net/qq_23179075/article/details/71123452
为什么推荐这个网站呢,因为这是我遇到各种坑后真正能解决我问题的文章。
这个过程非常难受,因为我把太多坑给踩了,主要原因是在配置没填准确,导致白白浪费了时间,以下是我的配置文件。
根目录下的build.gradle文件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'com.novoda:bintray-release:0.9'
}
}
以下是library的build.gradle的文件代码
apply plugin: 'com.novoda.bintray-release'
publish {
userOrg = 'wxsongsong' //bintray.com用户名
repoName = 'maven'//远程仓库名,默认为Maven
groupId = 'com.wxsongsong' //jcenter上的路径
artifactId = 'mylibrary' //项目名称
publishVersion = '1.0.1' //版本号
desc = 'Toast tools for Android,It is my frist Maven in Bintray. Only for Test.' //项目介绍,可以不写
website = '' //项目主页,可以不写
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}
输入以下这个代码,即可执行上传的代码,记得把xxx
填上用户名
和APIKEY
。
gradlew clean build bintrayUpload -PbintrayUser=xxx -PbintrayKey=xxx-PdryRun=false
执行后得到这个成功的信息,就可以去网站上查看代码啦。
这是依赖的地址,就算还在审核期间也可以用哟。
添加依赖地址就可以成功依赖库了!
allprojects {
repositories {
google()
jcenter()
maven {
url "https://dl.bintray.com/wxsongsong/maven"
}
}
}