這一章將通過一個(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í)。
我們經(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ù)豈不更方便?
現(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="" />
我們發(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="" />
表示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)用。