Gradle 入門

Gradle

常年搞.net,腳本構建工具是絕對沒有用過的,雖然也知道如何用命令行編譯 csproj : ## 命令行編譯 devenv *.csproj /build msbuild *.sln 但我的對於java的總體結構仍是很不瞭解的,做爲有編程基礎的同窗,天然但願可以更加的融入java的環境裏,因此第一步就是學習構建工具。 根據搜索引擎,java的構建工具主要有 ant+ivy,maven,gradle三種。其中我最早了解的應該仍是gradle,由於最開始學android的時候遇到過,不過由於用的是idea,因此也只是知道而已,後來想學習大數據,因而看了一下hadoop等,愈發的發現一個叫maven的東西應用普遍,讓我很是想學習一下。今天又瞭解了一下,仍是決定學新不學舊,仍是先學習一下gradle。html

安裝 gradle

java世界裏的安裝基本上都是下載,解壓,配置環境變量三步,gradle也不例外。java

  1. 下載gradle
  2. 配置環境變量 GRADLE_HOME 指向解壓後的程序目錄。
  3. 添加 %GRADLE_HOME%\bin 到PATH變量。 打開一個cmd,輸入 gradle -v 看一下輸出,問題應該不大,再也不多言。

瞭解gradle

下面參考了gradle入門系列 感謝大大們的辛勤付出 ^_^ ,侵刪。 首先是gradle的基本結構。 如同csproj和sln文件,java系的構建工具也是須要一個配置文件的,ant的build.xml,maven的pom.xml 而gradle的是 build.gradle,如你所見這是一個gradle文件,裏面用的是一種叫 graoovy的腳本語言,不須要了解太多,理解成一種約定好了格式的配置文件就行了(術語叫DSL領域特定語言),頓時以爲好高大上。android

下面是幾個概念:apache

  • 項目project 咱們的構建產物(如jar包)或實施產物(如war)編程

  • 任務task 不可分割的最小工做單元,即一個操做,如編譯,執行測試。我的理解上這裏的任務說的就是某個操做/命令,跟maven的生命週期裏的build,test這種有點像,gradle的不同之處在於gradle的task是由插件提供的,不一樣的插件提供不一樣的task,你也能夠直接在build.gradle中定義本身的task。app

  • 一個項目能夠執行多個任務框架

  • 既然提到了插件,那也簡單的說明一下,gradle的功能其實都是由插件提供的,在build.gradle文件中註冊插件以後就能夠對本項目使用插件中的提供的命令,這裏是gradle默認自帶的插件介紹eclipse

    下面詳細介紹gradle的相關文件:maven

  • build.gradle 指定一個項目和它的任務編輯器

  • gradle.properities 構建屬性文件

  • gradle.settings 指定多項目構建時候各個項目的關係,只有一個項目的時候能夠省略

    基本上來講,知道這些概念就差很少了,直接開始實踐,開始構建項目嘍。

gradle 實戰

建立項目

今天的目標就是新建一個java項目,引用apache的httpclient包訪問一個地址,程序類型是控制檯。 首先,新建一個文件夾, MyCrawl,新建一個文件 build.gradle,最好先打開一個vs code或者sublime等而後新建,由於右鍵新建的txt默認是gbk編碼的,我如今對編碼問題非常頭疼。 輸入內容:

apply plugin: 'java'

如上面的介紹,如今咱們添加了叫java的插件。 而後shift+右鍵打開命令窗口,輸入

gradle tasks

gradle

能夠見到不少綠色的task命令。就是咱們能夠執行 gradle assemble 這樣的意思。但如今文件夾是空的,因此先無論。 這時候想到如何建立項目及文件,你們知道java的項目通常是有固定格式的,好比 src/main/java/package 或 src/main/scala/package 等,因此咱們最開始也但願項目可以這麼組織。但是找了一下好像並無建立項目結構的task,因此是時候體驗gradle的強大之處了,打開 build.gradle,添加一下代碼。

// 在gradle中自定義一個task
// 沒錯,這個代碼是我網上copy下來的,因此不要期望博主能懂 [@_](https://my.oschina.net/u/2505668)@
task "create-dirs" << {
  sourceSets*.java.srcDirs*.each { it.mkdirs() }
  sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

保存以後,再次運行 gradle tasks 會發現多了一個 task。

create-dirs

好了,運行

gradle create-dirs

看一下,文件夾下面是否是多出了 src 目錄?

編譯項目

雖然上面確實新建目錄,可是包也仍是須要咱們本身創建的,不過我想gradle應該是有項目生成插件的,晚上時間緊迫,先不探討了。繼續寫項目。 在src/main/java下新建文件及目錄 com/cppor/mycrawl/Main.java 輸入一個常見的hello world程序,保存。

package com.cppor.mycrawl;
public class Main {
  public static void main(String[] args) {
    System.out.println("Hello world");
  }
}

上面提到gradle是用task來運行操做的,也經過tasks命令來查看了java插件提供了什麼命令。下面簡要的再次介紹一下幾個要用到的命令:

  • assemble 編譯源碼,打包jar文件,跳過單元測試

  • build 構建完整項目

  • clean 刪除構建目錄

  • compileJava 編譯源碼 因此這時候咱們先編譯源碼試一下。

    gradle compileJava

而後看一下文件夾下,多出了 build 目錄,其中 \build\classes\main\Main.class 應該就是咱們剛纔寫的 Main class了。 而後打開 cmd ,用java命令運行一下 class文件。 hello

不過咱們更經常使用的是jar包,因此執行

gradle build

而後發如今 \build\libs\ 下發現了生成的java包,可是執行後報錯: 報錯

因此這時候咱們要利用gradle制定jar包的Main方法。 打開 build.gradle 添加一下代碼:

jar {
    manifest {
        attributes 'Main-Class':'com.cppor.mycrawl.Main'            
    }
}

從新編譯jar包,看下是否是能夠了?

邊查資料邊寫博還挺累,快十一點了,明天繼續吧

** 2016-06-28 **

添加依賴

以前提到要使用HttpClient來訪問一個url,咱們來添加一下apache的http組件依賴。 若是你打開過csproj文件或者pom.xml文件,均可以看到定義的依賴信息,基本上就是文件位置,組件名稱之類的內容,其中maven的依賴只有名字和版本號,由於maven會自動從網上下載依賴的jar包(想一想也是蠻人性化的,.net有個叫nuget的工具好像相似,不過還沒用過),固然gradle的依賴也是能夠自動從網上下載的,並且能夠直接使用ivy或者maven的依賴倉庫。 首先,添加一下maven的默認倉庫,而後添加httpclient的依賴,在build.gradle 中添加如下代碼:

repositories {
  mavenCentral()
  maven {
      url "https://mavenrepository.com/artifact/org.apache.httpcomponents/httpclient"
  }
}

dependencies {
  compile 'org.apache.httpcomponents:httpclient:4.5.2'
}

而後從新運行 gradle build,發現已經自動下載了依賴。

依賴

而後在Main裏添加一點代碼,從新編譯運行便可。這裏就很少寫了,本身想寫什麼均可以。

發現一個問題,編譯出來的jar包直接運行會報錯httpclient不存在,應該是依賴沒有被打進包裏,晚上來再看吧

中午又看了一下大大的gradle教程,發現其實他們是提到了「胖」jar包的問題的。 因此須要繼續設置。 修改build.gradle

jar {
  from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it)       } }
manifest {
    attributes 'Main-Class': 'com.cppor.mycrawl.Main'
}
}

排版亂了點,你們湊合着看。 而後從新build,結果就能夠啦。 結果

測試項目

其實.net界也是支持單元測試的,vs還提供了一塊兒創建單元測試項目的選項,只是我呆的這兩家公司都沒有寫單元測試的要求。因此我也就沒有寫單元的習慣。。 並且咱們是作項目的並非產品,因此苦逼之處你們懂的。 因此如今開始寫java的話,養成寫單元測試的好習慣。TDD(測試驅動開發)也值得一試。 因此首先考慮一下把功能從Main函數中拆出來,寫到一個類裏,由於剛開始因此不要糾結,新建一個類把這個函數獨立處理吧。 首先把訪問一個 url 提取成一個類,而後添加 junit 的依賴。 修改 build.gradle

dependencies {
   compile 'org.apache.httpcomponents:httpclient:4.5.2'
   testCompile 'junit:junit:4+'       
}

而後在test\java\com\cppor\mycrawl 下添加一個 MainTest 類。基本代碼相似:

public class MainTest  {
private HttpTools tools ;

@Before
public void setUp() {
    tools = new HttpTools();
}

[@Test](https://my.oschina.net/azibug)
public void testHttpTools() {
    try {
        String html = tools.getUrlHtml("http://www.cppor.com");
        assertFalse(html == null || "".equals(html));

    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

我對junit的操做也不甚瞭解,看來框架會自動調用 @Before 和 @Test 的函數。而後使用 assert語句進行判斷。測試用例寫的很牽強,莫怪。

完成以後,可使用 gradle test 進行測試啦 個人建議是test以前最好先build一下,我好像遇到了直接運行test的時候class沒更新的狀況。結果就不貼了,你們腦補或本身操做吧。

IntelliJ IDEA

細心的童鞋可能已經發現上面編輯器是很熟悉的idea... 這個號稱最好的java IDE,不過我用它主要是由於他的界面比eclipse漂亮 /攤手。 idea固然是支持gradle的,直接用打開文件夾的形式打開項目,而後在 View->Tool Window -> Gradle 下面就能夠打開項目的gradle管理界面。

gradle管理

能夠見到右邊就是以前見到的task列表了。 右鍵直接執行某個任務就能夠了。 雖然能直接上ide,但仍是有了cmd基礎用起來才更安心了呢。

相關文章
相關標籤/搜索