Android Studio项目之Maven仓库

一、前言

  • 如果我们有多个项目要使用到同一份代码(框架、工具或自定义控件),可以把这份代码写成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。
项目结构v1

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

Nexus官网

3.2 安装Nexus

  • 1.将刚刚下载解压到目录,解压后会有两个目录:
    • sonatype-work(工作目录)
    • nexus-3.15.2-01(安装文件目录)
Nexus目录
  • 2.接下来切换到nexus-3.2.1-01/bin目录下,Shift键+右键鼠标,点击从此处打开命令窗口
启动命令窗口
  • 3.输入nexus.exe/run回车,执行后出现以下信息表示安装成功
nexus安装成功
  • 4.在浏览器中输入localhost:8081,就完成了配置nexus。
加载nexus主页
  • 5.登录访问nexus,默认登录账号和密码是adminadmin123
nexus主页
  • 6.Nexus的默认端口为8081,想修改默认端口可打开\nexus-3.15.2-01\etc目录下的nexus-default.properties文件,修改为想要的端口号即可。

3.3 遇到的问题

在搭建Nexus期间出现了一个异常,使用初始账号密码adminadmin123一直登不上。

无法登录Nexus

解决方法:问题就是无法连接到服务器,在Google找到类似的帖子,于是我把sonatype-work这个工作目录删掉,重新在命令窗口中安装Nexus。结果再次输入账号密码就成功了!


四、部署代码到Maven

4.1简述步骤:

  • 第一步:在mylibrarybuild.gradle文件的最底部添加脚本代码;
  • 第二步:创建gradle-mvn-push.gradle脚本文件。
  • 第三步:在gradle-mvn-push.gradle中填写脚本信息;
  • 第四步:执行Task任务。
  • 第五步:为app项目修改依赖的代码。
  • 第六步:引用依赖包中的方法,查看代码提示文本。

4.2具体步骤

  • 第一步:在mylibrarybuild.gradle文件的最底部添加脚本代码,表明引用这个脚本路径。
apply plugin: 'com.android.library'

android {
    ...
}
dependencies {
    ...
}
//引入这个文件脚本
apply from: rootProject.file('mylibrary/gradle-mvn-push.gradle')

  • 第二步:在mylibrarybuild.gradle文件的同层路径下新建gradle-mvn-push.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
第一种:双击uploadArchives
第二种:命令行执行gradlew uploadArchives
代码复制:gradlew uploadArchives

等待BUILD SUCCESSFUL后,就可以在浏览器中看到仓库中发布成功的依赖包。跟我们配置的一样,其中的文件有javadocsourcesarrpom这四种,他们分别代表编译后的java文件java源码Android Library格式文件配置文件

将项目上传到Maven
  • 第五步:为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

执行后得到这个成功的信息,就可以去网站上查看代码啦。

成功上传

这是依赖的地址,就算还在审核期间也可以用哟。

依赖Bintray地址

添加依赖地址就可以成功依赖库了!

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "https://dl.bintray.com/wxsongsong/maven"
        }
    }
}
成功依赖库 并显示中文

参考文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容