常年搞.net,腳本構建工具是絕對沒有用過的,雖然也知道如何用命令行編譯 csproj : ## 命令行編譯 devenv *.csproj /build msbuild *.sln 但我的對於java的總體結構仍是很不瞭解的,做爲有編程基礎的同窗,天然但願可以更加的融入java的環境裏,因此第一步就是學習構建工具。 根據搜索引擎,java的構建工具主要有 ant+ivy,maven,gradle三種。其中我最早了解的應該仍是gradle,由於最開始學android的時候遇到過,不過由於用的是idea,因此也只是知道而已,後來想學習大數據,因而看了一下hadoop等,愈發的發現一個叫maven的東西應用普遍,讓我很是想學習一下。今天又瞭解了一下,仍是決定學新不學舊,仍是先學習一下gradle。html
java世界裏的安裝基本上都是下載,解壓,配置環境變量三步,gradle也不例外。java
下面參考了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 指定多項目構建時候各個項目的關係,只有一個項目的時候能夠省略
基本上來講,知道這些概念就差很少了,直接開始實踐,開始構建項目嘍。
今天的目標就是新建一個java項目,引用apache的httpclient包訪問一個地址,程序類型是控制檯。 首先,新建一個文件夾, MyCrawl,新建一個文件 build.gradle,最好先打開一個vs code或者sublime等而後新建,由於右鍵新建的txt默認是gbk編碼的,我如今對編碼問題非常頭疼。 輸入內容:
apply plugin: 'java'
如上面的介紹,如今咱們添加了叫java的插件。 而後shift+右鍵打開命令窗口,輸入
gradle tasks
能夠見到不少綠色的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。
好了,運行
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文件。
不過咱們更經常使用的是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沒更新的狀況。結果就不貼了,你們腦補或本身操做吧。
細心的童鞋可能已經發現上面編輯器是很熟悉的idea... 這個號稱最好的java IDE,不過我用它主要是由於他的界面比eclipse漂亮 /攤手。 idea固然是支持gradle的,直接用打開文件夾的形式打開項目,而後在 View->Tool Window -> Gradle 下面就能夠打開項目的gradle管理界面。
能夠見到右邊就是以前見到的task列表了。 右鍵直接執行某個任務就能夠了。 雖然能直接上ide,但仍是有了cmd基礎用起來才更安心了呢。