随着公司业务的拓展以及项目规模的增加,项目的功能需求需要引入额外的jar包(或者其他类型的构件),需要去网上下载相对应的jar包,导入到项目中,还不一定能用够正常运行,因为它还可能需要依赖其他的jar包。而且下载下来的jar包有可能不是最新的,并且各个项目的jar包版本无法统一,还有一个问题就是公司内部开发的一些方便公司业务开发的jar包无法进行很好的管理,导致开发中出现一些不必要的问题出现。于是需要一款能够实现开发包管理的工具–Nexus。
Nexus
(也称Nexus私服)是Maven的仓库管理器,你可以使用Gradle
或者Maven
,从远程仓库或者本地仓库下载你所需要的构件。
Gradle 是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。
Google 推出 Android Studio 以来,就宣布默认使用 Gradle 来作为构建工具,并且之后放弃更新 ADT ,从此 Gradle 走入 Android 开发者的视野。
一般来说,构建工具除了编译、运行、签名、打包等,Gradle还具备依赖管理的功能,什么是依赖管理呢?还是拿 Eclipse 来说,我们以前在 Eclipse 上开发 Android ,如果需要用到第三方库的时候一般都是先下载 jar 文件,然后把 jar 文件添加到 libs 目录,然后项目中就可以引用了。但是你不觉得这种管理方式很麻烦么?假设第三方库有更新,需要下载最新的 Jar 文件,然后替换掉原来的,引用的库少还好,一旦引用的第三方库多,那简直麻烦死,可以说这种方式只有依赖,而没有管理。
现在大家不陌生的 Gradle 引用第三方库方式是这样的
compile 'com.android.support:support-v4:24.0.1'
类似这样的依赖方式,是不是很方便?而且很直观,直接可以看到源地址,升级的话直接改下版本号就可以了,这就是所谓的依赖管理,而且加入你要使用最新的版本,但是不知道目前的版本号,可以把”24.0.1”换成”+”号就行。
ANT 是最早的构建工具,基于idea,不过它的XML脚本编写格式让XML文件特别大。对工程构建过程中的过程控制特别好。
Maven 它是用来给Ant补坑的,Maven第一次支持了从网络上下载的功能,仍然采用xml作为配置文件格式。Maven专注的是依赖管理,构建这活并不擅长。
Gradle 属于结合以上两个的优点,它继承了Ant的灵活和Maven的生命周期管理。Ant编写容易,但功能有限,需要人工操作的过程也多;Maven依托于庞大的依赖仓库,因此有着强大的外部依赖管理,但添加本地依赖并不方便,且项目不能灵活修改。而Gradle可以随意的编写任务并组合成项目,直接利用Maven仓库,并且能很好的支持传递依赖
和内部依赖
。所以最后被google作为了Android御用管理工具。
下面是gradle同maven实现相同功能的代码量对比:
这个是用Maven写的 ↓
2.3
com.google.code.kaptcha
kaptcha
${kaptcha.version}
jdk15
org.springframework
spring-core
org.springframework
spring-beans
org.springframework
spring-context
junit
junit
这个是用Gradle写的 ↓
dependencies {
compile('org.springframework:spring-core:2.5.6')
compile('org.springframework:spring-beans:2.5.6')
compile('org.springframework:spring-context:2.5.6')
compile('com.google.code.kaptcha:kaptcha:2.3:jdk15')
testCompile('junit:junit:4.7')
}
可以看出使用Gradle仅仅用几行代码就可以实现原本需要20几行代码量的功能,依赖的groupId
、artifactId
、 version
什么都没少,而且极大的增强了可读性。
Gradle 跟 Android Studio 其实没有关系,但是 Gradle 官方还是很看重 Android 开发的,Google 在推出 AS 的时候选中了 Gradle 作为构建工具,为了支持 Gradle 能在 AS 上使用,Google 做了个 AS 的插件叫 Android Gradle Plugin ,所以我们能在 AS 上使用 Gradle 完全是因为这个插件的原因。在项目的根目录有个 build.gradle 文件,里面有这么一句代码:
classpath 'com.android.tools.build:gradle:2.1.2'
这个就是依赖 gradle 插件的代码,后面的版本号代表的是 android gradle plugin 的版本,而不是 Gradle 的版本
,这个是 Google 定的,跟 Gradle 官方没关系 - -||
如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库远程提供了,假如没网了或者出现其他情况,我们怎么办?
这也就是说我们对中央仓库的依赖性太高了。而搭建一个Nexus服务器相当于我们在我们本地局域网搭建了一个类似中央仓库的服务器,我们可以将中央仓库的一些资料下载到私服务器上,然后平时我们的gradle或maven项目就是直接访问局域网内的私服即可,既节省了网络带宽也会加速项目搭建的进程,这样对我们开发来说,对公司来说都是非常好的选择,而且可以方便对公司内部开发包的管理。
Nexus的 仓库类型 主要分为以下四种:
group: 仓库组(用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可)
hosted:宿主(通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库)
proxy:代理代理(它们被用来代理远程的公共仓库,如maven中央仓库。)
virtual:虚拟
选择一个仓库作为要上传的仓库对象,选择Artifact Upload
选项进入上传设置页面,填写对应的包名,构件名和包名等信息,然后选择Select Artifact(s) to Upload
选择你要上传的jar包,点击Add Artifact
按钮加入上传列表,最后点击Upload Artifact(s)
进行上传~
但是这种方式上传aar包时不能实现传递依赖,所以只能上传jar包
1.首先在gradle.properties文件中进行数据信息的配置
# POM属性设置
POM_VERSION=1.0
POM_GROUP_ID=minstone.common
POM_ARTIFACT_ID=mdcommon
POM_PACKAGING=aar
# 私服的地址
RELEASE_REPOSITORY_URL=http://192.168.9.80:8081/nexus/content/repositories/md/
SNAPSHOT_REPOSITORY_URL=http://192.168.9.80:8081/nexus/content/repositories/md/
# NEXUS用户名和密码
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
2.创建一个gradle文件,本例子命名为upload.gradle
,在改文件里面编写需要上传的代码
apply plugin: 'maven'
def getReleaseRepositoryUrl() {
return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
: "https://oss.sonatype.org/service/local/staging/deploy/maven2"
}
def getSnapshotRepositoryUrl() {
return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
: "https://oss.sonatype.org/content/repositories/snapshots"
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
snapshotRepository(url: getSnapshotRepositoryUrl()) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.project {
groupId POM_GROUP_ID
artifactId POM_ARTIFACT_ID
version POM_VERSION
packaging POM_PACKAGING
}
}
}
}
//源代码
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
artifacts {
archives androidSourcesJar
}
}
3.在需要上传的包的build.gradle文件中引入新创建的gradle包
apply plugin: 'com.android.library'
apply from: '../upload.gradle'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
// applicationId "minstone.common"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
group = POM_GROUP_ID
version = POM_VERSION
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
4.最后执行任务自己完成上传
(1) 引用或上传maven仓库之前记得在Project目录下面的build.gradle下配置Nexus仓库地址
allprojects {
repositories {
jcenter()
maven {
url "http://192.168.9.80:8081/nexus/content/groups/public/"
}
}
}
(2) 构建名称中间不能使用空格作为分隔符,最好使用.作为分隔符.