鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 介紹這個(gè)Gradle項(xiàng)目
依賴管理實(shí)戰(zhàn)
配置遠(yuǎn)程倉庫
安裝Gradle
簡(jiǎn)介
項(xiàng)目自動(dòng)化簡(jiǎn)介
配置子項(xiàng)目
Gradle強(qiáng)大的特性
自動(dòng)化測(cè)試
簡(jiǎn)介
掌握構(gòu)建生命周期
使用命令行操作
構(gòu)建Java項(xiàng)目
管理任務(wù)
構(gòu)建工具
連續(xù)傳遞的特性
用Gradle開發(fā)Web項(xiàng)目
聲明依賴
構(gòu)建塊
簡(jiǎn)介
測(cè)試Java應(yīng)用
java構(gòu)建工具
為什么選擇Gradle
拆分項(xiàng)目文件
單元測(cè)試
多項(xiàng)目打包
Gradle 起步
介紹這個(gè)Gradle項(xiàng)目
簡(jiǎn)介
自定義腳本
Gradle包裝器
簡(jiǎn)要概述依賴管理
項(xiàng)目模塊化

介紹這個(gè)Gradle項(xiàng)目

第一個(gè)Gradle項(xiàng)目

這一章將通過一個(gè)例子來介紹Gradle的強(qiáng)大特性,你將從中學(xué)到怎么用Gradle的標(biāo)準(zhǔn)插件來引導(dǎo)、配置和運(yùn)行你的應(yīng)用,這章結(jié)束的時(shí)候你應(yīng)該對(duì)Gradle的工作機(jī)制有個(gè)清晰的認(rèn)識(shí)。

The To Do Application

我們經(jīng)常需要同時(shí)管理多個(gè)項(xiàng)目,有時(shí)候會(huì)發(fā)現(xiàn)多個(gè)項(xiàng)目很難維護(hù)達(dá)到了難以控制的地步,為了擺脫這個(gè)困惑,我們可以維護(hù)一個(gè)to-do列表,顯然你可以把你所有要完成的任務(wù)寫在一張紙上,當(dāng)時(shí)如果能夠隨時(shí)隨地查詢你要完成的任務(wù)豈不更方便?

任務(wù)管理的情形

現(xiàn)在你知道了你的最終目的,每一個(gè)任務(wù)管理系統(tǒng)都是由一系列的任務(wù)組成的,任務(wù)通常有一個(gè)標(biāo)題,任務(wù)可以添加到任務(wù)列表中,可以標(biāo)記任務(wù)的完成狀態(tài)以及刪除任務(wù),如下圖所示:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag9.png" alt="" /> http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag10.png" alt="" />

實(shí)現(xiàn)用戶交互功能

我們發(fā)現(xiàn)這個(gè)TO DO 應(yīng)用包含典型的創(chuàng)建、讀取、更新、刪除操作(CRUD),要持久化數(shù)據(jù),你需要用一個(gè)模型來給任務(wù)建模,我們創(chuàng)建一個(gè)叫ToDoItem的Java類,一個(gè)POJO對(duì)象,為了簡(jiǎn)化這個(gè)應(yīng)用,我們這里不采用數(shù)據(jù)庫來存儲(chǔ),而是把數(shù)據(jù)存儲(chǔ)在內(nèi)存中,這很容易實(shí)現(xiàn)。實(shí)現(xiàn)存儲(chǔ)接口的類是InMemoryToDoRespository,缺點(diǎn)就是你的應(yīng)用程序關(guān)閉之后你就無法持久化數(shù)據(jù)了,后面我們會(huì)繼續(xù)完善這個(gè)應(yīng)用。

每一個(gè)標(biāo)準(zhǔn)的Java應(yīng)用都有一個(gè)Main Class,應(yīng)用程序的入口。這里的main class是ToDoApp,我們將會(huì)展現(xiàn)一欄的命令給用戶選擇,每一個(gè)命令被映射成一個(gè)枚舉類型CommandLineInput,ComandLineInputHandler類用來處理用戶輸入執(zhí)行相應(yīng)的任務(wù)。

下圖顯示了整個(gè)流程:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag11.png" alt="" />

搭建應(yīng)用的每一個(gè)模塊

表示Todo模型的類ToDoItem

    package com.manning.gia.todo.model;

    public class ToDoItem implements Comparable<ToDoItem> {
       private Long id;
       private String name;
       private boolean completed;
       (...)
    }

模型持久化接口ToDoRepository

    package com.manning.gia.todo.repository;

    import com.manning.gia.todo.model.ToDoItem;
    import java.util.Collection;

    public interface ToDoRepository {
        List<ToDoItem> findAll();
        ToDoItem findById(Long id);
        Long insert(ToDoItem toDoItem);
        void update(ToDoItem toDoItem);
        void delete(ToDoItem toDoItem);
    }

接下來創(chuàng)建一個(gè)可擴(kuò)展的、線程安全的實(shí)現(xiàn):

    package com.manning.gia.todo.repository;

    public class InMemoryToDoRepository implements ToDoRepository {
        private AtomicLong currentId = new AtomicLong();
        private ConcurrentMap<Long, ToDoItem> toDos = new ConcurrentHashMap<Long, ToDoItem>();

        @Override
        public List<ToDoItem> findAll() {
            List<ToDoItem> toDoItems = new ArrayList<ToDoItem>(toDos.values());
            Collections.sort(toDoItems);
            return toDoItems;

        }

        @Override
        public ToDoItem findById(Long id) {
            return toDos.get(id);
        }

        @Override
        public Long insert(ToDoItem toDoItem) {
            Long id = currentId.incrementAndGet();
            toDoItem.setId(id);
            toDos.putIfAbsent(id, toDoItem);
            return id;
        }

    @Override
    public void update(ToDoItem toDoItem) {
        toDos.replace(toDoItem.getId(), toDoItem);
    }

    @Override
    public void delete(ToDoItem toDoItem) {
       toDos.remove(toDoItem.getId());
    }

    }

應(yīng)用程序的入口

    package com.manning.gia.todo;
    import com.manning.gia.todo.utils.CommandLineInput;
    import com.manning.gia.todo.utils.CommandLineInputHandler;

    public class ToDoApp {
        public static final char DEFAULT_INPUT = '\u0000';
        public static void main(String args[]) {
            CommandLineInputHandler commandLineInputHandler = new
            CommandLineInputHandler();
            char command = DEFAULT_INPUT;

            while(CommandLineInput.EXIT.getShortCmd() != command) {
                commandLineInputHandler.printOptions();
                String input = commandLineInputHandler.readInput();
                char[] inputChars = input.length() == 1 ? input.toCharArray()
                char[] { DEFAULT_INPUT };
                command = inputChars[0];
                CommandLineInput commandLineInput = CommandLineInput.getCommandLineInputForInput(command);
                commandLineInputHandler.processInput(commandLineInput);
            }

        }
    }

到目前為止我們討論了應(yīng)用的組件和用戶交互。接下來就要用Gradle實(shí)現(xiàn)項(xiàng)目的自動(dòng)化構(gòu)建,編譯源代碼、打包JAR文件、運(yùn)行應(yīng)用。