1 環境說明
操作系統 Ubuntu 14.04(x64)
maven maven3.3.9
jdk jdk-1.8.0_65
nexus nexus2.11.4
gradle gradle2.9
2安裝
分別解壓縮,然後添加進PATH環境變量。
3使用
使用maven
$M2_HOME/conf/settings.xml: Maven全局配置 ${USER_HOME}/.m2/settings.xml: 用戶的全局配置(優先) <repositories> <repository> <id>central</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </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 用以保存第三方jar Snapshpts 用以項目組內部的快照 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-snapshots</id> <username>admin</username> <password>admin123</password> <server> <servers> <mirrors> <mirror> <id>nexus</id> <name>internal nexus repository</name> <url>http://192.168.3.5:8081/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf><!--這裏只鏡像central,可以改爲*,匹配全部--> </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 APP android {//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 APP com.android.library 申明爲Android Library maven 使用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方法``` @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } ``` MultiDex這部分內容加載是在靜態方法之後,故若application中如果有靜態方法,不要引用非第一個dex文件中的方法。而且編譯的buildtool必須是21以上。
自定義任務task說明
可以通過gradle tasks 方法查詢當前定義的所有task gradle properties 查看project中定義的property gradle 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"