怎么把自己的Android library上传到jCenter和Maven Central
看了网上好多篇相关文章,研究许久,才终于成功,自己整理并分享给大家
如果你想在Android Studio中引入一个library到你的项目,你只需添加如下的一行代码到模块的build.gradle文件中。
dependencies {compile 'com.facebook.fresco:fresco:0.9.0' }
就是如此简单的一行代码,你就可以使用这个library了。
酷呆了。不过你可能很好奇Android Studio是从哪里得到这个library的。这篇文章将详细讲解这是怎么回事,包括如何把你的库发布出去分享给世界各地的其他开发者,这样不仅可以让世界更美好,还可以耍一次酷。
Android studio 是从哪里得到库的?
先从这个简单的问题开始,我相信不是每个人都完全明白Android studio 是从哪里得到这些library的。莫非就是Android studio 从google搜索然后下载了一个合适的给我们?
呵呵,没那么复杂。Android Studio是从build.gradle里面定义的Maven 仓库服务器上下载library的。Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。总的来说,只有两个标准的Android library文件服务器:jcenter 和 Maven Central。
jcenter
jcenter是一个由 bintray.com维护的Maven仓库 。你可以在这里看到整个仓库的内容。
我们在项目的build.gradle 文件中如下定义仓库,就能使用jcenter了:
- allprojects {
- repositories {
- jcenter()
- }
- }
Maven Central
Maven Central 则是由sonatype.org维护的Maven仓库。你可以在这里看到整个仓库。
注:不管是jcenter还是Maven Central ,两者都是Maven仓库
我们在项目的build.gradle 文件中如下定义仓库,就能使用Maven Central了:
- allprojects {
- repositories {
- mavenCentral()
- }
- }
注意,虽然jcenter和Maven Central 都是标准的 android library仓库,但是它们维护在完全不同的服务器上,由不同的人提供内容,两者之间毫无关系。在jcenter上有的可能 Maven Central 上没有,反之亦然。
除了两个标准的服务器之外,如果我们使用的library的作者是把该library放在自己的服务器上,我们还可以自己定义特有的Maven仓库服务器。Twitter的Fabric.io 就是这种情况,它们在https://maven.fabric.io/public上维护了一个自己的Maven仓库。如果你想使用Fabric.io的library,你必须自己如下定义仓库的url。
- repositories {
- maven { url 'https://maven.fabric.io/public' }
- }
然后在里面使用相同的方法获取一个library。
- dependencies {
- compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
- }
但是将library上传到标准的服务器与自建服务器,哪种方法更好呢?当然是前者。如果将我们的library公开,其他开发者除了一行定义依赖名的代码之外不需要定义任何东西。因此这篇文章中,我们将只关注对开发者更友好的jcenter 和 Maven Central 。
实际上可以在Android Studio上使用的除了Maven 仓库之外还有另外一种仓库:Ivy 仓库 。但是根据我的经验来看,我还没看到任何人用过它,包括我,因此本文就直接忽略了。
理解jcenter和Maven Central
为何有两个标准的仓库?
事实上两个仓库都具有相同的使命:提供Java或者Android library服务。上传到哪个(或者都上传)取决于开发者。
起初,Android Studio 选择Maven Central作为默认仓库。如果你使用老版本的Android Studio创建一个新项目,mavenCentral()会自动的定义在build.gradle中。
但是Maven Central的最大问题是对开发者不够友好。上传library异常困难。上传上去的开发者都是某种程度的极客。同时还因为诸如安全方面的其他原因,Android Studio团队决定把默认的仓库替换成jcenter。正如你看到的,一旦使用最新版本的Android Studio创建一个项目,jcenter()自动被定义,而不是mavenCentral()。
有许多将Maven Central替换成jcenter的理由,下面是几个主要的原因。
- jcenter通过CDN发送library,开发者可以享受到更快的下载体验。
- jcenter是全世界最大的Java仓库,因此在Maven Central 上有的,在jcenter上也极有可能有。换句话说jcenter是Maven Central的超集。
- 上传library到仓库很简单,不需要像在 Maven Central上做很多复杂的事情。
- 友好的用户界面
- 如果你想把library上传到 Maven Central ,你可以在bintray网站上直接点击一个按钮就能实现。
基于上面的原因以及我自己的经验,可以说替换到jcenter是明智之举。
所以我们这篇文章将把重心放在jcenter,反正如果你能成功把library放在jcenter,转到 Maven Central 是非常容易的事情。
gradle是如何从仓库上获取一个library的?
在讨论如何上传library到jcenter之前,我们先看看gradle是如何从仓库获取library的。比如我们在 build.gradle输入如下代码的时候,这些库是如果奇迹般下载到我们的项目中的。
- compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'
一般来说,我们需要知道library的字符串形式,包含3部分
- GROUP_ID:ARTIFACT_ID:VERSION
上面的例子中,GROUP_ID是com.inthecheesefactory.thecheeselibrary ,ARTIFACT_ID是fb-like,VERSION是0.9.3。
GROUP_ID定义了library的group。有可能在同样的上下文中存在多个不同功能的library。如果library具有相同的group,那么它们将共享一个GROUP_ID。通常我们以开发者包名紧跟着library的group名称来命名,比如com.squareup.picasso。然后ARTIFACT_ID中是library的真实名称。至于VERSION,就是版本号而已,虽然可以是任意文字,但是我建议设置为x.y.z的形式,如果喜欢还可以加上beta这样的后缀。
下面是Square library的一个例子。你可以看到每个都可以很容易的分辨出library和开发者的名称。
- dependencies {
- compile 'com.squareup:otto:1.3.7'
- compile 'com.squareup.picasso:picasso:2.5.2'
- compile 'com.squareup.okhttp:okhttp:2.4.0'
- compile 'com.squareup.retrofit:retrofit:1.9.0'
- }
那么在添加了上面的依赖之后会发生什么呢?简单。Gradle会询问Maven仓库服务器这个library是否存在,如果是,gradle会获得请求library的路径,一般这个路径都是这样的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。比如可以在http://jcenter.bintray.com/com/squareup/otto/1.3.7 和 https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/
下获得com.squareup:otto:1.3.7的library文件。
然后Android Studio 将下载这些文件到我们的电脑上,与我们的项目一起编译。整个过程就是这么简单,一点都不复杂。
我相信你应该清楚的知道从仓库上下载的library只是存储在仓库服务器上的jar 或者aar文件而已。有点类似于自己去下载这些文件,拷贝然后和项目一起编译。但是使用gradle依赖管理的最大好处是你除了添加几行文字之外啥也不做。library一下子就可以在项目中使用了。
了解aar文件
等等,我刚才说了仓库中存储的有两种类型的library:jar 和 aar。jar文件大家都知道,但是什么是aar文件呢?
aar文件时在jar文件之上开发的。之所以有它是因为有些Android Library需要植入一些安卓特有的文件,比如AndroidManifest.xml,资源文件,Assets或者JNI。这些都不是jar文件的标准。
因此aar文件就时发明出来包含所有这些东西的。总的来说它和jar一样只是普通的zip文件,不过具有不同的文件结构。jar文件以classes.jar的名字被嵌入到aar文件中。其余的文件罗列如下:
- /AndroidManifest.xml (mandatory)
- /classes.jar (mandatory)
- /res/ (mandatory)
- /R.txt (mandatory)
- /assets/ (optional)
- /libs/*.jar (optional)
- /jni/<abi>/*.so (optional)
- /proguard.txt (optional)
- /lint.jar (optional)
可以看到.aar文件是专门为安卓设计的。因此这篇文章将教你如何创建与上传一个aar形式的library。
如何上传library到jcenter
概述
将自己写的库上传到Jcenter或者Maven提供给自己或者别人使用,在构建项目的时候只要写上一行如下类似的引用代码即可引用自己的库。是不是很酷的一件事情,本文一步一步教你如何将自己的代码发布到JCenter上,带你装逼带你飞。
compile 'com.android.support:recyclerview-v7:23.3.0'
- 1
- 1
本人使用的软件环境
软件名称 | 版本号 |
---|---|
操作系统 | Windows 10 |
Android Studio | 2.2.2 |
Gradle | 2.14.1 |
com.android.tools.build:gradle | 2.2.2 |
com.github.dcendents:android-maven-gradle-plugin | 1.5.0 |
com.jfrog.bintray.gradle:gradle-bintray-plugin | 1.7.3 |
上传到代码到Jcenter
1.到Bintray官网注册账号
到Bintray官网注册账号,填写相关信息,填写的Organization Id很重要,一定要记起来到时候上传代码的时候要用。另外邮箱也不要填写比如qq.com、163.com的邮箱,会无法注册的。最好是填写GMail邮箱地址。注册完成之后到你填写的邮箱里面去激活Bintray账号即可。
2.创建代码仓库
点击上图所示的“Add NewRepository”按钮,添加代码仓库,点击后就会跳转到下图的界面。
在上图的Name输入框中输入代码仓库的名称,名字可以随便写,但是一定要记得,因为后面上传代码的时候还要用,Type选择Maven即可。点击Create即可创建代码仓库,若创建成功则会跳转到下面的页面。
如上图红色框框所示代码仓库的路径就是Organization Id/Repository Name,本人创建的代码仓库即为(coolcode/maven),另外要记住的信息是上图右上角的Bintray User(Bintray的用户名),因为后面上传代码要用到。
3.获取账号对应的API KEY
点击个人头像进入到个人信息主界面,点击Edit按钮即可进入到上图所示的界面。点击“API KEY”,输入Bintray本账号的登陆密码,即可查看到本账号的API KEY。到此为止我们已经获取到了如下四条重要的信息,请牢记:
- Organization Id(组织ID)
- Repository Name(仓库名称)
- Bintray User(Bintray账号的用户名)
- Bintray API Key(Bintray账号的API KEY)
4.在Project的build.gradle添加如下信息
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:2.2.2'classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' //用于打包Maven所需文件classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' //用于上传Maven生成的文件到Bintray}}allprojects {repositories {jcenter()}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
5.在Module的根目录下创建bintrayUpload.gradle文件
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'//加载属性文件
Properties properties = new Properties()
File localPropertiesFile = project.file("bintray.properties");
if (localPropertiesFile.exists()) {properties.load(localPropertiesFile.newDataInputStream())
}
File projectPropertiesFile = project.file("project.properties");
if (projectPropertiesFile.exists()) {properties.load(projectPropertiesFile.newDataInputStream())
}//读取属性def projectRepositoryName = properties.getProperty("project.repositoryName")
def projectName = properties.getProperty("project.name")
def projectGroupId = properties.getProperty("project.groupId")
def projectArtifactId = properties.getProperty("project.artifactId")
def projectVersionName = android.defaultConfig.versionName
def projectPackaging = properties.getProperty("project.packaging")
def projectSiteUrl = properties.getProperty("project.siteUrl")
def projectGitUrl = properties.getProperty("project.gitUrl")def developerId = properties.getProperty("developer.id")
def developerName = properties.getProperty("developer.name")
def developerEmail = properties.getProperty("developer.email")def bintrayUser = properties.getProperty("bintray.user")
def bintrayApikey = properties.getProperty("bintray.apiKey")
def bintrayOrganizationId = properties.getProperty("bintray.organizationId");def javadocName = properties.getProperty("javadoc.name")/*
*这句代码一定要加否则会出现如下错误
* Could not upload to 'https://api.bintray.com/content/coolcode/maven/LibUiBase/1.0.0/CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.pom': HTTP/1.1 400 Bad Request [
message:Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path 'CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.p
om']
* */
group = projectGroupId// 配置生成POM.xml文件的参数
install {repositories.mavenInstaller {pom {project {name projectNamegroupId projectGroupIdartifactId projectArtifactIdversion projectVersionNamepackaging projectPackagingurl projectSiteUrllicenses {license {name 'The Apache Software License, Version 2.0'url 'http://www.apache.org/licenses/LICENSE-2.0.txt'}}developers {developer {id developerIdname developerNameemail developerEmail}}scm {connection projectGitUrldeveloperConnection projectGitUrlurl projectSiteUrl}}}}
}//生成sources.jar
task sourcesJar(type: Jar) {from android.sourceSets.main.java.srcDirsclassifier = 'sources'
}task javadoc(type: Javadoc) {source = android.sourceSets.main.java.srcDirsclasspath += project.files(android.getBootClasspath().join(File.pathSeparator))
}//生成javadoc.jar
task javadocJar(type: Jar, dependsOn: javadoc) {classifier = 'javadoc'from javadoc.destinationDir
}artifacts {archives javadocJararchives sourcesJar
}//javadoc的配置
javadoc {options {encoding "UTF-8"charSet 'UTF-8'author trueversion projectVersionNamelinks "http://docs.oracle.com/javase/7/docs/api"title javadocName}
}/*
*userOrg为bintray账号信息里面的Organization Id
*repo为你创建的仓库名称
* 如果上述两个字段写错了,则会出现下面类似的错误
*Could not create package 'huangxuanheng/maven/fragmentstack': HTTP/1.1 404 Not Found [message:Repo 'maven' was not found]
*
*
* */
bintray {user = bintrayUserkey = bintrayApikeyconfigurations = ['archives']pkg {userOrg = bintrayOrganizationIdrepo = projectRepositoryNamename = projectNamewebsiteUrl = projectSiteUrlvcsUrl = projectGitUrllicenses = ["Apache-2.0"]publish = true}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
6.在Module的build.gradle中应用上面创建的bintrayUpload.gradle文件,添加如下代码
apply from: "bintrayUpload.gradle"
- 1
- 1
7.在Module的根目录下创建第5步要读取的配置文件
创建bintray.properties用于配置bintray和开发者信息
#配置bintray账号相关信息#bintray用户名,不是登陆邮箱,是个人中心右上角显示的名字
bintray.user=xxx
#bintray的ApiKey
bintray.apiKey=xxxxxxxxxxx
#bintray的Organization Id
bintray.organizationId=xxx#配置开发者信息#昵称 需修改
developer.id=xxx
#姓名
developer.name=xxx#邮箱
developer.email=xxx@gmail.com
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
创建project.properties用于配置项目信息
#project#仓库名称,就是在bintray官网建立的仓库的名称 project.repositoryName=maven #项目名称 project.name=library #项目组id project.groupId=com.lyf.library#项目id,一般同project.name project.artifactId=library#打包类型 project.packaging=aar #项目官方网站地址 需修改 project.siteUrl=https://github.com/xxx/library #项目git地址 需修改 project.gitUrl=https://github.com/xxx/library.git
#生成的javadoc名称 javadoc.name=library
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
8.在Terminal窗口下收入如下指令上传到Bintray
gradlew install
gradlew bintrayUpload
- 1
- 2
- 1
- 2
若出现BUILD SUCCESSFUL则说明成功上传到了Bintray。 注:以上所有xxx都需要替换成自己配置
9.添加Package到JCenter
进入到Bintray网站,找到刚才上传的项目,点击右下角的“Add To JCenter”按钮。
然后填写项目描述点击“Send”提交审核即可,如果审核成功,它会给你发送一封站内信通知你。
10.引用成功
//引用方式如下
compile '项目组ID:项目名称:项目版本号'//引用示例
compile 'com.android.support:recyclerview-v7:23.3.0'
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
常见问题及解决方案
1.
Could not upload to 'https://api.bintray.com/content/coolcode/maven/LibUiBase/1.0.0/CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.pom': HTTP/1.1 400 Bad Request [
message:Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path 'CommonLibrary/LibUiBase/1.0.0/LibUiBase-1.0.0.p
om']
- 1
- 2
- 3
- 1
- 2
- 3
解决方案:
出现这个问题的原因有可能是project.properties里面的project.name的属性值与project.artifactId不一致,或者是bintrayUpload.gradle里面的group = projectGroupId脚本没有写,尝试修改上面两种可能出现该问题的脚本。
2.
Could not create package 'coolcode/maven/LibUIBase': HTTP/1.1 404 Not Found [message:Repo 'maven' was not found]
- 1
- 1
解决方案:
出现这个问题的原因可能是名为maven的仓库(不一定是叫maven,名字只要和bintray网站建立仓库时的名称一致即可)没有建立,或者建立了仓库,但是名称不叫maven,又或者组织名称不叫coolcode,因为项目上传的路径为:组织ID/仓库名称/项目名,所以检查组织ID和仓库名称是否正确即可解决问题。
怎么把自己的Android library上传到jCenter和Maven Central相关推荐
- Android Library上传到JCenter仓库实践
前言 这段时间研究了下以前做app开发的时候并没有太过关注的JCenter仓库,在实际开发当中通常都是使用第三方开发者上传到jcenter的library,而我们使用的这些library或者plugi ...
- Android Studio项目如何上传至JCenter
Android studio Library项目上传至JCenter 配置Project目录下build.gradle dependencies {classpath 'com.jfrog.bintr ...
- 图片上传压缩android,android 图片上传压缩常见问题分析
图片的上传与压缩是android经常需要用到的步骤,那么,如何解决上传图片oom问题呢?android 图片上传压缩常见问题分析,希望可以帮助大家更加的了解android 图片方面的困惑. 下面,是我 ...
- Android拍照上传代码样例
2019独角兽企业重金招聘Python工程师标准>>> Android拍照上传代码样例 1.LoginWindow.java --登录窗口 package com.hemi.rhet ...
- app应用分发平台|苹果ios超级签名|APP封装打包|应用内测托管平台|iOS应用企业签名|Android应用上传内测-虾分发
CDN分发平台-注册免审核-虾分发 https://xiafenfa.com/ app应用分发平台|苹果ios超级签名|APP封装打包|应用内测托管平台|iOS应用企业签名|Android应用上传内测 ...
- android app上传
第三方Android应用市场占有率分析 谷歌Android和苹果iOS作为主流的智能手机手机操作系统,引领者手机APP的发展潮流.乔布斯的苹果追求完美,围绕iPhone建立了自己的独立王国,AppS ...
- Android 文件上传的几种方式
这两天和新来的同事做一个项目,用到了文件上传,在这里记录下历程 Android文件上传有各种各样的Http框架,我也就简单说说我常用的吧,LiteHttp,OkHttp的封装还没做完全,有时间会补上, ...
- Android头像上传实战模拟
Android头像上传实战模拟 在开发中头像的上传应该是必不可少的,话不多说上效果图! 点击头像弹出PopupWindow分别三个按钮. <?xml version="1.0" ...
- Android Studio 上传代码到Gitee
最近在学校里做Android的项目,一直不会通过Android Studio上传代码到Gitee,经过查阅博客和文章,现在将方法总结如下: 一.安装Git 1.下载Git 可在Git官网下载 http ...
最新文章
- 关于jsp页面中的pageEncoding和contentType以及html中的meta标签中字符集的设置(转)...
- ArXiv 2020 | 抖音“变身漫画”滤镜背后的技术,难道来自这篇论文?
- 语言专升本必背代码_2020年【山西省专升本】,专升本专业与考试科目,专升本招生院校,专升本报名流程大全!...
- 每日一题(14)—— 交换a,b的值(不使用中间变量)
- java异常看不懂_报错了 看不懂求解
- 帝国cms模板嵌入php,帝国cms模板中php调用信息的例子
- Python接口自动化-接口基础(二)
- 戴机械手表有哪些事情就不能做了?
- 浅谈接龙红包的技术实现
- 前缀无歧义编码(PFC)
- android 组态软件,Livzenwex安卓版组态软件
- 服装收银系统2022年排行榜新鲜出炉!
- 2019网易校招(1星) 俄罗斯方块
- 293、Java中级10 -【多线程】 2020.03.31
- CCF201809-3 元素选择器
- 关于使用手机电池替换3节干电池的尝试
- java使用bks双向认证_GitHub - wanglijun93/RxHttpUtils: Rxjava+Retrofit封装,便捷使用
- BGP协议详解(一)
- 智能镜子制作_更智能的镜子及其制作方法
- java计算机毕业设计宠物医院管理源码+数据库+系统+lw文档+部署
热门文章
- 树莓派安装使用数据库SQLite
- 计算机开题报告指导教师意见,开题报告指导教师意见怎么写
- android activity自动重启,8) 十分钟学会android--Activity的生命周期之停止与重启
- java上传文件并保存到服务器----大文件上传
- HBase2.x(三)HBase Shell操作
- 计算机基础十进制转二进制,计算机基础---1、十进制0.1转二进制
- Retrofit下载大文件、监听进度、断点续传
- 华为笔试题总结———个公司做团建活动,排成1个M行N列的队形...请按报数顺序输出特战队员的编号列表(N*2的二维数组)
- android开发月薪4万怎么样,一位3年Android开发的焦虑:月薪不到3万,担心被应届生取代...
- js返回上一页和刷新页面