① 如何通俗地理解 Gradle
來自知乎:
如何通俗地理解 Gradle?
我以前一直用 Eclipse with ADT 來開發android 項目,而且對它的基礎的原理掌握不深,直接上手開發的,沒有去考慮太多的東西。現在手頭上有一個新的項目要使用到Android Studio ,我早有耳聞AS大名,但是由於本人才疏學淺,這幾天在學習AS的過程中對Gradle這個東西表示很不能理解,找了很多資料但是都描述得很專業,所以想問問各位,有沒有什麼比較形象易懂的解釋來描述一下Gradle,它是什麼東西,它有什麼用,相對於Eclipse with ADT 中編譯Android 程序的機制,他有什麼優勢?
ghui
謝邀
Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言來聲明項目設置,而不是傳統的XML。當前其支持的語言限於java、Groovy和Scala,計劃未來將支持更多的語言。
上面是維基上對Gradle的解釋,相信一個沒有接觸過構建的人是不大能看明白的,當初我也是.下面是我對Gradle通俗的理解:
軟體開發講究代碼復用,通過復用可以使工程更易維護,代碼量更少..... 開發者可以通過繼承,組合,函數模塊等實現不同程度上的代碼復用.但不知你有沒有想過,軟體開發也是一種工程作業,絕不僅僅是寫代碼,還涉及到工程的各種管理(依賴,打包,部署,發布,各種渠道的差異管理.....),你每天都在build,clean,簽名,打包,發布,有沒有想過這種過程,也可以像代碼一樣被描述出來, 也可以被復用.
舉個例子
我是做Android開發的,你可知道國內有n個Android市場,n個手機品牌,n個手機尺寸......,一般公司都會針對不同的市場單獨發包用來統計不同渠道的下載量等情況,可能需要針對不同(品牌,尺寸等各種硬體信息)的手機做一些特殊的處理,這個時候你可以針對不同的情況單獨建一個工程,或者更好一點你可以通過一些變數來控制,像這樣:
if(isMoto){do something} else if(isHuawei){do something} ...
差異管理
但這兩種解決方法都有自己的缺點,特別是前一種有極大的代碼重復.後一種稍微好一點,但這種方式的差異是運行時的,不是靜態的,對於moto手機上的處理邏輯對華為手機來說一點作用也沒有,但這一段針對moto手機的處理邏輯也被裝到了華為手機上了,通過gradle的proctFlavor與buildtype可以實現靜態級的差異控制可以參考如何通過Gradle實現一套代碼開發不同特性的APK · ByGhui
說到前面的多渠道問題,不同的渠道一般會對應不同的渠道號,你當然可以通過修改一次打一個包這種純手工的方式來生成你的多渠道包,但據聽說國內某團購網站的Android App有100多個渠道.這里出現了什麼?重復,反復的去打包而且這些包之前的差異很小(只是渠道號不同),和寫代碼一樣我們應該復用,通過Gradle可以實現一個命令打出所有的渠道包,一個命令打出指定的渠道包.再復雜一點,你可能需要不同的渠道對應不同的簽名文件,不同的icon,不同的伺服器地址...這些都可以通過Gradle來方便的實現.
依賴管理:
做軟體開發你可能需要依賴各種不同的jar,library.你當然可以通過將.jar/library工程下載到本地再到你的工程中,但不知你是否聽說過國外有個叫中央倉庫的東西,在這個倉庫里你可以找到所有你能想到以及你從來沒聽說過的jar,aar...The Central Repository Search Engine這里可以找到所有你需要的依賴,而你需要的只是指定一個坐標,如下:
<img src="https://pic4.mg.com/_b.jpg" data-rawwidth="330" data-rawheight="24" class="content_image" width="330">剩下的依賴的尋找,下載,添加到classpath等你都不需要去關心,通過這種方式來維護依賴的好處有以下幾點:
剩下的依賴的尋找,下載,添加到classpath等你都不需要去關心,通過這種方式來維護依賴的好處有以下幾點:
依賴不會進入到你的版本控制倉庫中(默認會緩存到~/.gradle/下)
方便卸載裝載依賴(只是一條坐標依賴,不需要刪除即可)
方便的版本管理,如上圖中的2.3.3既是picasso的版本號,若改為+就表示從中央倉庫中下載最新的版本
不同工程的相同依賴不會存在重復副本(只在~/.gradle下存在一份)
項目部署
這方面我沒怎麼接觸過,但據我所知通過一些插件,可以實現自動將你的輸出(.jar,.apk,.war...)上傳到指定倉庫,自動部署...
羅哩羅嗦說了這么多,不知大家有沒有理解
總結一下:
Gradle是一種構建工具,它可以幫你管理項目中的差異,依賴,編譯,打包,部署......,你可以定義滿足自己需要的構建邏輯,寫入到build.gradle中供日後復用.
Gradle不是一種編程語言,它不能幫你實現軟體中的任何實際功能
通俗的解釋肯定是不嚴謹的解釋,不妥之處歡迎討論.
###
贊同過百,放出之前相關分享的幻燈片
###
截止到現在(1432311622353)共收到342個贊同與感謝,再次感謝大家的支持!如果你覺得我的分享對你有幫助,請關注我! 以後我會分享更多更優質的內容給大家.
說好的幻燈片在這里
(是之前在樂視時一次內部分享的幻燈片,內容有刪減(涉及到公司具體項目的部分),此幻燈片參考了很多其它的資料,內部的鏈接很值得大家打開看看)
編輯於 2017-02-2753 條評論感謝
nonesuccess
你都說了要通俗的理解,那就用不著學習什麼理論了,通俗著來就是了。
通俗的說:gradle是打包用的。
你覺得解決你的問題了嗎?如果沒解決,那是你的問題提得不夠好。比如我猜你應該提:為什麼要打包發布,打包發布有幾種常見方法,為什麼這些常見方法中要選gradle,等等。
針對我猜的這些內容,通俗的講是這樣的:
以在eclipse裡面寫java程序為例
為什麼需要打包:
最初寫完了,直接右鍵run就可以了。但是程序寫完了畢竟是要發布到伺服器上或者給別人用的,你第一不可能讓所有要運行的人都裝個eclipse,第二不可能把源代碼公布給所有人。所以你需要把你的代碼發布成二進制形式,讓其它環境方便運行,這就是打包。
為什麼用ant
打包的時候要做很多事,比如說配置文件中的用戶名和密碼,你本地開發和程序實際運行時的內容肯定不一致,所以需要有兩個文件,開發的時候用一個,實際運行的時候用一個。這樣每次打包的時候都要重復的做這些事,ant可以讓你用xml的形式把這些事情寫成腳本,然後自動運行。
為什麼用maven
你的項目要用很多jar包,比如你寫日誌要用個log4j吧,連資料庫要用個connector吧。這年頭寫程序不用個spring都不好意思出門,下載下來的spring包打開一看,密密麻麻的好幾十個jar,不知道用哪個不用哪個。而且,即便是你一狠心把這些jar包都放進來,很大可能性還是不能運行,因為還要依賴其它的jar包。哪天想升級個spring小版本,所有jar包都要重來一遍,你也不記得哪些是由於spring引進來的jar包了。
所以有了maven,你只要配置一下說我要用spring 3,所有jar包都給你下載好了,你直接運行就行了。趕明兒想升級版本,直接把3改成4,新的jar包也給你下載好了。
然後?
用了maven,jar包是方便了,但我打包的時候還是有好多事要做啊,然後你會發現maven實在是不知道怎麼做這些事,於是開始懷念ant。
gradle就是又能幹maven的活,又能幹ant的活,用groove語言寫腳本,表達能力還更強。
就這意思。
===
我也是這兩天才看了兩眼gradle,了解不深。簡化版如下:
ant可以自動化打包邏輯。
maven也可以自動化打包,相比於ant,它多做的事是幫你下載jar包。
但是maven的打包邏輯太死板,定製起來太麻煩,不如ant好用。gradle就是又能自動下jar包,又能自己寫腳本,並且腳本寫起來還比ant好用的這么個東西。
② Gradle 的任務怎麼執行gradle 命令
terminal到你當前project的目錄:
windows下: 輸入gradlew yourTaskName就好,比如gradlew tasks 輸出各種task
linux下:輸入.\gradlew yourTaskName
③ eclipse怎麼配置gradle
一、Gradle簡介
Gradle 是以 Groovy 語言為基礎,面向Java應用為主。基於DSL(領域特定語言)語法的自動化構建工具。
二、配置步驟如下:
1、資源下載:
Grandle官網下載Gradle
④ gradle配置不成功,求助貼
近項目遇蠻煩問題Maven約定標准Java項目代碼結構:
project
--src
--main
--java
--resources
--test
--java
--resources
『gradle idea』構建intelliJ項目文件自幫忙設置所Source RootTest Source Root我工作部門我希望測試unitintg2類別更加容易區測試目同提供Build Pipeline別運行同類別測試能力我部門內標准Java項目結構:
project
--src
--main
--java
--resources
--test
--common
--java
--unit
--java
--resources
--intg
--java
--resources
目錄結構我剩2問題要解決:
1. 何區運行IntegrationTestUnit Test
2. 何保證『gradle idea』需重新設置Test Source Rootgradle具備識別新代碼結構能力
何寫Gradle Plugin
語言:
JavaGroovyScala都推薦用Groovy,畢竟Gradle本質說用Groovy寫DSL使用Groovy更致點
注入式:
Gradle支持3種形式定製Plugin注入:
1. 直接Plugin源代碼直接寫Build Script面
2. Pluigin源代碼寫rootProjectDir/buildSrc/src/main/groovy目錄
3. 用單獨project寫Plugin源代碼jar依賴形式注入項目
覺都想要自寫Plugin定項目公用Plugin否則直接Plugin代碼直接寫腳本要定製Plugin我看定需要單獨jar形式注入
寫project-structure Plugin:
Gradle寫Plugin非簡單首先添加項目依賴我使用Groovy寫插件所添加localGroovy依賴
Gradle代碼
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
寫Plugin實現代碼實現代碼需要實現Plugin介面即我實現代碼做兩件事定製項目代碼結構二添加integrationTest Task該Task運行*IntegrationTest.class, Build Pipeline階段運行Unit TestIntegrationTest
Groovy代碼
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
class ProjectStructurePlugin implements Plugin {
@Override
void apply(Project project) {
project.logger.info "Configuring Project Structure for $project.name"
project.configurations {
integrationTestCompile { extendsFrom testCompile }
integrationTestRuntime { extendsFrom integrationTestCompile, testRuntime }
}
configureSourceSets(project)
addIntegrationTestTask(project)
}
private void addIntegrationTestTask(Project project) {
Test intgTest = project.getTasks().create("integrationTest", Test.class);
intgTest.testClassesDir = project.sourceSets.integrationTest.output.classesDir
intgTest.includes = ["**/*IntegrationTest.class"]
intgTest.inputs.dir 'src'
intgTest.outputs.dir project.sourceSets.integrationTest.output.classesDir
project.check.dependsOn project.integrationTest
intgTest.dependsOn project.test
}
private void configureSourceSets(Project project) {
project.sourceSets {
test {
java {
srcDir 'src/test/unit/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/unit/resources'
}
}
integrationTest {
java {
srcDir 'src/test/intg/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/intg/resources'
}
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
}
}
}
}
接著項目src/main/resources/META-INF/gradle-plugins目錄創建文件:.properties,該文件指定Plugin實現類:
Java代碼
implementation-class=com.xianlinbox.plugins.ProjectStructurePlugin
項目使用該Plugin
首先需要build.gradle腳本引入該Pluginjar包依賴文件形式更推薦jar包發布Maven庫Maven依賴形式注入本例使用本文件依賴:
Groovy代碼
buildscript {
dependencies {
classpath fileTree(dir: 'libs', include: '*.jar')
}
}
注入編寫插件注意該插件必須java plugin起使用其使用SourceSets屬性該插件引入進:
Groovy代碼
apply plugin: 'java'
apply plugin: 'project-structure'
插件通『gradle test』『gradle integrationtTest』區別運行UnitTestIntrgrationTest
解決自設置Test Source Root問題需要build.gradleideaMole Task增加識別Test Source Root能力即:
Groovy代碼
apply plugin: 'idea'
...
idea {
mole {
testSourceDirs += file('src/test/intg/java')
testSourceDirs += file('src/test/intg/resources')
}
}
我寫Plugin設置Project-Structrue:
Groovy代碼
......
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
project.idea {
mole {
testSourceDirs = testSourceDirs + new File('src/test/intg/java') + new File('src/test/intg/resources')
}
}
1、安裝
Gradle安裝Maven便需要載( )==》解壓==》配置環境變數(GRADLE_HOME & PATH)配置環境變數記使用 source命令使新環境變數效配置功命令行通 gradle -v"驗證否安裝功
2、Gradle編譯Maven風格java項目
首先項目根目錄創建"build.gradle"文件編譯java項目需要使用gradlejava插件
Groovy代碼
apply plugin: 'java'
,要集maven功能需要添加maven插件
Groovy代碼
apply plugin: 'maven'[
接著配置項目Repository風格
Groovy代碼
repositories{
mavenCentral();
}
面例使用默認maven央庫想用自本庫通式配置
Groovy代碼
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
repositories {
// Use local Maven repo location. We don't need this if we only want to install
// an artifact, but we do need it if we want to use dependencies from the local
// repository.
mavenRepo urls: localMavenRepo
mavenCentral()
}
再配置項目依賴第三庫配置模板:
Groovy代碼
dependencies{
compile group: '',name:'',version:''
}
舉例假設項目依賴4.10版本junit配置
Groovy代碼
compile group: 'junit',name:'junit',version:'4.10'
另外Depencies按式簡寫
Groovy代碼
compile '::'
例
Groovy代碼
compile 'junit:junit:4.10'
何自項目發布Repository
Groovy代碼
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://localhost/tmp/myRepo/")
}
}
⑤ 如何 gradle build
1. 為什麼選擇Gradle?
2. 簡單入門
2.1 使用Intellij Idea創建gradle項目
首先在Idea中啟用Gradle支持:Settings->Plugins: Gradle
然後創建一個gradle項目或模塊,會發現目錄結構和maven的很像,其中build.gradle是gradle的配置文件,類似於maven中pom.xml文件,以下是build.gradle的簡單示例:
apply plugin: 'java'
group = 'org.yousharp'
version = '1.0-SNAPSHOT'
sourceCompatibility = 1.7
targetCompatibility = 1.7
repositories {
mavenCentral()
maven { url "repo.maven.apache.org/maven2" }
}
dependencies {
compile group: 'com.google.guava', name: 'guava', version:'17.0'
compile group: 'redis.clients', name: 'jedis', version:'2.6.0'
testCompile group: 'junit', name: 'junit', version:'4.11'
}
插件(plugin):是gradle的一種擴展,gradle預定義了很多插件,常見的如java插件、war插件等;java插件中定義了一些有用的task,如編譯源碼、執行單元測試、生成jar包、約定默認的目錄結構等; repositories定義倉庫,dependencies定義項目的依賴,比maven的XML定義更簡潔;
那麼,如何編譯、測試,以及運行gradle的項目呢?
剛才說到java插件預定義了很多task,其中就包括編譯、測試、生成jar包等task,可以在命令行通過 $ gradle tasks 查看項目已定義的所有task以及含義,如java插件中常用的task有:
+ assemble: 編譯
+ build:編譯並執行測試
+ clean:刪除build目錄
+ jar: 生成jar包
+ test:執行單元測試
2.2 將Java項目從maven遷移到gradle
如何將一個java項目從maven遷移到gradle呢?gradle集成了一個很方便的插件:Build Init Plugin,使用這個插件可以很方便地創建一個新的gradle項目,或者將其它類型的項目轉換為gradle項目。
要將maven項目轉換為gradle項目,只需要在項目的pom文件所在的目錄下執行以下命令:
$ gradle init --type pom
上面的命令會根據pom文件自動生成gradle項目所需的文件和配置,然後以gradle項目重新導入即可。
⑥ gradle.properties文件在哪
通常在項目的根目錄,在Android Studio 創建一個項目的時候,根目錄下會生成gradle.properties和local.properties文件。
properties的數據格式:
採用鍵值對的方式,寫法:key=value
(6)gradle編譯命令擴展閱讀
項目結構
1、app/build:app模塊編譯輸出的文件。
2、app/libs: 放置引用的類庫文件。
3、app/src: 放置應用的主要文件目錄。
4、app/src/androidTest:單元測試目錄。
5、app/src/main:主要的項目目錄和代碼。
6、app/src/main/assets:放置原生文件,裡面的文件會保留原有格式,文件的讀取需要通過流。
7、app/src/main/java:項目的源代碼。
8、build:系統生成的文件目錄。
9、gradle: wrapper的jar和配置文件所在的位置。
10、.gitattributes:用於設置文件的對比方式。
11、.gitignore: 忽略的文件或者目錄。
12、build.gradle:項目的gradle編譯文件。
13、gradle.properties: gradle相關的全局屬性設置。
14、gradlew: 編譯腳本,可以在命令行執行打包。
15、gradlew.bat:windows下的gradle wrapper可執行文件。
16、local.properties:配置SDK/NDK所在的路徑。
17、MyApplication.iml:保存該模塊的相關信息。
18、README.md:文本編輯器,記錄一些相關信息。
19、settings.gradle:設置相關的gradle腳本。
20、External Libraries:項目依賴的庫,編譯時自動下載。
⑦ gradle 內置了哪些tasks
1. 為什麼選擇Gradle?
2. 簡單入門
2.1 使用Intellij Idea創建gradle項目
首先在Idea中啟用Gradle支持:Settings->Plugins: Gradle
然後創建一個gradle項目或模塊,會發現目錄結構和maven的很像,其中build.gradle是gradle的配置文件,類似於maven中pom.xml文件,以下是build.gradle的簡單示例:
apply plugin: 'java'
group = 'org.yousharp'
version = '1.0-SNAPSHOT'
sourceCompatibility = 1.7
targetCompatibility = 1.7
repositories {
mavenCentral()
maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
compile group: 'com.google.guava', name: 'guava', version:'17.0'
compile group: 'redis.clients', name: 'jedis', version:'2.6.0'
testCompile group: 'junit', name: 'junit', version:'4.11'
}
插件(plugin):是gradle的一種擴展,gradle預定義了很多插件,常見的如java插件、war插件等;java插件中定義了一些有用的task,如編譯源碼、執行單元測試、生成jar包、約定默認的目錄結構等; repositories定義倉庫,dependencies定義項目的依賴,比maven的XML定義更簡潔;
那麼,如何編譯、測試,以及運行gradle的項目呢?
剛才說到java插件預定義了很多task,其中就包括編譯、測試、生成jar包等task,可以在命令行通過 $ gradle tasks 查看項目已定義的所有task以及含義,如java插件中常用的task有:
+ assemble: 編譯
+ build:編譯並執行測試
+ clean:刪除build目錄
+ jar: 生成jar包
+ test:執行單元測試
2.2 將Java項目從maven遷移到gradle
如何將一個java項目從maven遷移到gradle呢?gradle集成了一個很方便的插件:Build Init Plugin,使用這個插件可以很方便地創建一個新的gradle項目,或者將其它類型的項目轉換為gradle項目。
要將maven項目轉換為gradle項目,只需要在項目的pom文件所在的目錄下執行以下命令:
$ gradle init --type pom
上面的命令會根據pom文件自動生成gradle項目所需的文件和配置,然後以gradle項目重新導入即可。
⑧ 如何在 Eclipse 下用 Gradle 構建 Web Application
使用的環境是: Eclipse IDE for Java EE Developers Kepler + JDK 1.7.
好, 下面正式開始:
1.安裝 Gradle 插件. 在 Eclipse Marketplace 中搜索 Gradle, 選擇安裝 Gradle Integration for Eclipse
2.新建一個 Dynamic Web Project, 在項目根目錄下新建 build.gradle 文件, 並向其中寫入如下內容:
importorg.gradle.plugins.ide.eclipse.model.Facet
applyplugin:'java'
applyplugin:'war'
applyplugin:'eclipse-wtp'
sourceCompatibility=1.7//設置JDK版本
webAppDirName='WebContent'//設置WebApp根目錄
sourceSets.main.java.srcDir'src'//設置Java源碼所在目錄
//設置maven庫地址
repositories{
mavenCentral()//中央庫
//maven{url'http://maven.oschina.net/content/groups/public/'}//自定義庫地址
}
//設置依賴
dependencies{
providedCompile'javax.servlet:servlet-api:2.5'//編譯期
providedRuntime'javax.servlet:jstl:1.2'//運行時
}
//設置ProjectFacets
eclipse{
wtp{
facet{
facetname:'jst.web',type:Facet.FacetType.fixed
facetname:'wst.jsdt.web',type:Facet.FacetType.fixed
facetname:'jst.java',type:Facet.FacetType.fixed
facetname:'jst.web',version:'3.0'
facetname:'jst.java',version:'1.7'
facetname:'wst.jsdt.web',version:'1.0'
}
}
}
3.接下來在項目上右擊 -> configure -> convert to Gradle project
4.再次在項目上右擊 -> Gradle -> Refresh All
5.如果沒有 web.xml 文件的話, 再右擊項目 -> Java EE Tools -> Generate Deployment Descriptor Stub
6.最後看下效果如何, 在 WebContent 下新建 index.jsp 裡面隨便寫點什麼, 然後項目上右擊 -> Run As -> Run on Server
如果成功顯示的話那麼就一切 OK 了.
⑨ gradle可以編譯android源碼嗎
方法/步驟
1
(可以省略)通過cmd命令行下載gradle源碼:
git clone https://github.com/spring-guides/gs-gradle-android.git
2
下載最新的gradle安裝包,地址:
http://gradle.org/downloads
點擊下載二進制文件
3
解壓到d盤,路徑為:D:\gradle-2.4
4
打開「計算機」-「右鍵」-「屬性」-「更改設置」-「高級」-「環境變數」,
在系統變數中,點擊新建,屬性名為GRADLE_HOME,屬性值為"D:\gradle-2.4"
5
打開「計算機」-「右鍵」-「屬性」-「更改設置」-「高級」-「環境變數」,
在系統變數中,找到Path,將";D:\gradle-2.4\bin"加入到Path中
6
打開cmd命令行,執行gradle,如果出現如圖所示,則說明gradle安裝成功
7
打開cmd命令行,進入android工程目錄,找到build.gradle文件,在目錄執行執行
gradle build
既可開始使用gradle打包apk,在成功後會在同目錄生成build文件夾,