Android使用gradle的管理本地Maven服务器
1 环境说明
操作系统 Ubuntu 14.04(x64)maven maven3.3.9jdk jdk-1.8.0_65nexus nexus2.11.4gradle gradle2.9
2安装
分别解压缩,然后添加进PATH环境变量。
3使用
使用maven
$M2_HOME/conf/settings.xml: Maven全局配置${USER_HOME}/.m2/settings.xml: 用户的全局配置(优先)<repositories> <repository> <id>centralid> <name>Central Repositoryname> <url>http://repo.maven.apache.org/maven2url> <layout>defaultlayout> <snapshots> <enabled>falseenabled> snapshots> repository>repositories><pluginRepositories> <pluginRepository> <id>centralid> <name>Central Repositoryname> <url>http://repo.maven.apache.org/maven2url> <layout>defaultlayout> <snapshots> <enabled>falseenabled> snapshots> <releases> <updatePolicy>neverupdatePolicy> releases> pluginRepository>pluginRepositories>其参数:localRepository 本地repository路径 interactiveMode:是否需要和用户交互以获得输入,true:需要 usePlugRegistry:是否需要plugin-registry.xml文件来管理插件版本。 offline 是否需要在离线模式下运行-->不能连接网络服务器时,有用 proxy 代理相关设置 server 服务器相关设置 mirrors 为仓库列表配置的下载镜像列表 repositories 远程仓库列表,是maven用来填充构建系统本地仓库所使用的一组远程项目
使用nexus
nexus start 启动服务nexus stop 停止服务
服务启动后,访问地址为:http://localhost:8081/nexus,系统管理员为admin/admin123
配置仓库
nexus里面可以配置的仓库有三种:proxy 远程仓库的代理,当用户向这个proxy请求一个artifact,proxy首先会再本地找, 找不到再从远程服务器下载,然后返回hosted 宿主仓库,用户可以把自己的一些构件,deploy到hosted中group 仓库组,nexus的概念,多仓库聚合。
配置Central,修改Download Remote Index 为true。
配置Hosted Repository,Deployment Policy选项,Snapshots会配置成allow,其他的设置为disable。3rd party 用以保存第三方jarSnapshpts 用以项目组内部的快照Release 用以项目内部的发布版
group是一个虚拟的仓库,通过对实体仓库(proxy.hosted)进行聚合,对外暴漏统一地址。
maven client端配置
配置了一个server,其中增加了权限相关信息,<?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http:// maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>nexus-snapshotsid> <username>adminusername> <password>admin123password> <server> <servers> <mirrors> <mirror> <id>nexusid> <name>internal nexus repositoryname> <url>http://192.168.3.5:8081/nexus/content/groups/public/url> <mirrorOf>centralmirrorOf> mirror> mirrors><settings>
以上是直接使用maven的方式配置,对于Android而言,可以直接使用gradle托管,方便很多,具体如下:
Gradle配置
方式一:每个项目更改,build.gradle文件allprojects { repositories { maven{ credentials{ username 'admin' password 'admin123' } url 'http://192.168.3.5:8081/nexus/content/groups/public/' } //jcenter() //mavenLocal() }}
方式二:在USER_HOME/.gradle/目录下添加init.gradle文件,内容如下:
allprojects{repositories { def REPOSITORY_URL = 'http://192.168.3.5:8081/nexus/content/groups/public/' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL." remove repo } } } maven { url REPOSITORY_URL } }}
init.gradle是Gradle的初始化脚本,也是运行时全局配置。
发布到maven
修改build.gradle,添加
apply plugin:'maven'uploadArchives{ repositories{ mavenDeployer{ pom.groupId = "com.felix.test" pom.version = "1.0.0" repository(url: "http://192.168.3.5:8081/nexus/content/groups/public/") { authentication(userName: admin, password: admin123) } } }}
然后执行 gradle uploadArchives 上传到本地库。
gradle浅析
project 指一个项目
task 构建过程中的任务
build.gradle 配置文件,负责构建的定义。每个module对应一个gradle文件project层的build.gradle分析
buildscript { repositories { //构建过程中依赖的仓库,这里是指gradle脚本需要的资源位置。 jcenter() } dependencies { //构建过程中依赖的库 classpath 'com.android.tools.build:gradle:1.5.0' //申明gradle的版本 }}allprojects { //这里配置当前project中每个module公有的依赖仓库,这样每个module不用单独配置。这里是项目需要的仓库资源位置。 repositories { jcenter() }}
某个module中的build.gradle
apply plugin: 'com.android.application' //申明为Android APPandroid {//android构建时需要的参数配置 compileSdkVersion 23 //sdk版本 buildToolsVersion "23.0.1" //buildtool版本,以上两个版本,都需要你sdk中相应内容已经安装。否则会报错。(当然也可以改成你已经安装的版本) defaultConfig { //默认配置,会同时应用到debug和release版本 applicationId "com.felix.testweatherfish" //app包名,apply plugin中指定当前是com.android.application,才能包含此项。 minSdkVersion 15 //最低支持的SDK版本 targetSdkVersion 23 //目标(编译)SDK版本 versionCode 1 //app版本 versionName "1.0" //app 版本号 multiDexEnabled true //支持多dex,具体见后续分析 } sourceSets { //目录映射关系说明 main { //系统默认的source set manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] res.srcDirs = ['res'] compile } api{ //这里若是不设置 java.srcDirs 则默认使用${path-to-project}/src/api/java目录。 //这里若是不设置 res.srcDirs 则默认使用${path-to-project}/src/api/resources目录。 //当然也可以使用类似main中自定义目录。 //编译的时候使用gradle apiClasses } } repositories{//编译本地aar依赖,最终需要在dependencies中添加引用 flatDir{ dir 'aarlib' //aar依赖文件所在目录 } } signingConfigs { //签名配置 HetConfig { //签名配置标签,可以有多个 //建议密码不要明文写这里,写在gradle.properties中,再通过storeFile引用 storeFile file("Het_KeyStore") //签名文件 storePassword "szhittech" //签名密码 keyAlias "Clife" //应用别名 keyPassword "szhittechclife" //应用别名密码 } } lintOptions { //移除lint检查的error abortOnError false } compileOptions{ //编译选项,以下指定了Java版本 sourceCompatibility javaVersion.VERSION_1_7 targetCompatibility javaVersion.VERSION_1_7 } buildTypes { //这里可以配置debug和release版本的一些参数,比如混淆,签名等 release { //指定release版本编译的特殊参数 minifyEnabled false //是否混淆,混淆的时候会去掉一些无用的方法等 shrinkResources true //压缩资源,会去掉无用的资源文件 //混淆使用的文件,前面部分是系统默认的Android混淆文件, //此文件位于sdk目录/tools/proguard/proguard-android.txt. //后面试项目中自定义的混淆文件,两部分一起配合使用来混淆工程。 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.HetConfig //使用上面定义的签名配置文件 } debug{ //debug版本一般使用默认签名就可以 //默认签名文件位于${home}/.android/debug.keystore //默认签名的引用方法 signingConfig android.signingConfig.debug } }}task HelloWorld <<{ //定义一个任务,具体分析见下面 println "Hello World!"}task copyFile(type: Copy){ //自定义任务,将xml文件夹下的所有内容拷贝到destination。这两个目录都是build.gradle所在目录下的目录。 from 'xml' into 'destination' description "test" //描述信息}task taskA(dependsOn: copyFile){ //taskA依赖于copyFile这个task, //即在执行gradle taskA的时候,会先执行 gradle copyFile def source = fileTree('srcDirs') //文件夹和文件位置定义 def destination = file('destination.txt') //设置任务的输入输出路径,以实现增量编译 inputs.dir source outputs.file destination doLast{ destination.withPrintWriter {writer -> sources.each {source -> writer.println source.text } } }}dependencies { //当前模块的依赖 compile fileTree(dir: 'libs', include: ['*.jar']) //编译lib目录里面的所有*.jar文件 testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' provided 'com.android.support:design:23.1.1' //编译时依赖,但不包含 compile project(':test:SimpleAndroid') //编译test目录下的SimpleAndroid compile 'com.android.common:baseprj:23.1.1@aar' //编译依赖第三方的aar文件 compile (name:'xxx', ext:'aar')编译本地aar依赖文件 compile (group:'xxxx', name: 'xxxx', version: 'xxxx'){ exclude group:'xxx', module:'xxx' //排除依赖,解决依赖冲突,module对应的就是artifactId。 } compile 'com.android.support:multidex:1.0.0' //支持多dex,具体见后续分析}
解析说明:
apply plugin: ''
申明.com.android.application 申明为Android APPcom.android.library 申明为Android Librarymaven 使用maven作为jar/aar包的依赖管理,通过maven仓库下载项目依赖war 指定web项目编译(build)生成war包java 指定项目为Java项目,项目编译时生成jar包 jetty 加入jetty支持,代码修改后直接 gradle jettyRun即可运行项目可以添加自定义插件
defaultConfig中涉及到除了上面例子中内容外,还有
siginingConfig/proguardFiles等
支持MultiDex
首先在defaultConfig中,设置multiDexEnabled true
然后,在dependencies中添加依赖compile 'com.android.support:multidex:1.0.0'
最后,在application中,复写attachBaseContext方法```@Overrideprotected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this);}```MultiDex这部分内容加载是在静态方法之后,故若application中如果有静态方法,不要引用非第一个dex文件中的方法。而且编译的buildtool必须是21以上。
自定义任务task说明
可以通过gradle tasks 方法查询当前定义的所有taskgradle properties 查看project中定义的propertygradle dependencies 查看当前project的依赖关系<< 表示向HelloWorld中加入执行代码(groovy代码)
wrapper目录下的gradle-wrapper.properites文件
该文件申明了gradle目录与下载路径以及当前项目使用的gradle版本。
setting.gradle
include ':app',':test:SimpleAndroid'
主要用于申明需要加入gradle的module。
gradle任务
assemble 构建项目输出
check 运行检测和测试任务
build 运行assemble和check
clean 清理输出任务关于gradle更多资料,可以参考这篇博客
使用SNAPSHOT
发布SNAPSHOT版本的时候REPO_RELEASE = ‘false’ 否则REPO_RELEASE =’true’.
uploadArchives{ repositories{ def REPO_RELEASE = 'false' if(REPO_RELEASE == 'true'){ mavenDeployer{ pom.groupId = "com.felix.test" pom.version = "1.0.0" repository(url: "http://192.168.3.5:8081/nexus/content/groups/public/") { authentication(userName: admin, password: admin123) } }else{ mavenDeployer{ pom.groupId = "com.felix.test" pom.version = "1.0.0-≈" snapshotRepository(url: "http://192.168.3.5:8081/nexus/content/groups/public/") { authentication(userName: admin, password: admin123) } } } }
- 解决gradle配置完成后,REPO_RELEASE无法自动获取最新版本
compile group:"com.android.common",name:"BaseProject",version:"1.0.0-SNAPSHOT",changing:"true"
更多相关文章
- Android(安卓)相对布局中的 代码中修改属性与布局文件的设置不同
- Android学习过程中问题记录
- Fragment使用
- Android(安卓)N 各种ANR的时间
- Android(安卓)OpenGL ES 播放 yuv420p文件
- Android(安卓)常用代码集合
- Android(安卓)studio配置Kotlin
- 解决android studio国内开发者Gradle下载慢问题
- Android(安卓)代码混淆