ant——你要是不會
它是一個build tool
ant的好處我們都體會到了
但是
仔細想想
如果把task作為基本的組成元件
到此
很多script
下面談談我對一個基於script的built tool的構想
首先
我們定義這樣一個接口
java代碼:
interface Command{
Object execute(CommandContext ctxt)
throws Throwable;
}
我們計劃讓所有的task(我們這裡叫它們command)都實現這個接口
CommandContext負責傳遞一些象log之類的信息
這個execute返回一個Object
我們允許這個函數拋出任何異常
然後
java代碼:
class ReturnCommand implements Command{
private final Object v;
public Object execute(CommandContext ctxt){
return v;
}
ReturnCommand(Object v){this
}
PrintCommand負責打印一句話
java代碼:
class PrintCommand implements Command{
private final String msg;
public Object execute(CommandContext ctxt){
ctxt
return null;
}
PrintCommand(String msg){this
}
FailCommand負責報告錯誤
java代碼:
class FailCommand implements Command{
private final String msg;
public Object execute(CommandContext ctxt){
throw new CommandException(msg);
}
FailCommand (String msg){this
}
如此等等
但是
我們最需要的
而組合
java代碼:
class SeqCommand implements Command{
private final Command c
private final Command c
public Object execute(CommandContext ctxt){
c
return c
}
SeqCommand (Command c
this
this
}
}
上面這個簡單的Command
除了順序執行
java代碼:
interface CommandRecovery{
Command recover(Throwable th)
throws Throwable;
}
當某個command失敗的時候
然後定義具體的錯誤恢復邏輯
java代碼:
class RecoveredCommand implements Command{
private final Command c
private final CommandRecovery c
public Object execute(CommandContext ctxt){
try{
return c
}
catch(Throwable th){
return c
}
}
RecoveredCommand (Command c
this
this
}
}
有try
java代碼:
class FinallyCommand implements Command{
private final Command c
private final Command c
public Object execute(CommandContext ctxt){
try{
return c
}
finally{
c
}
}
FinallyCommand (Command c
this
this
}
}
前面的順序執行
java代碼:
interface CommandBinder{
Command bind(Object v);
}
然後定義BoundCommand類
java代碼:
class BoundCommand implements Command{
private final Command c
private final CommandBinder c
public Object execute(CommandContext ctxt){
final Object v = return c
return c
}
BoundCommand (Command c
this
this
}
}
先透露一下
基本上的框架搭好了
java代碼:
new BoundCommand(
new GetTimeCommand()
new CommandBinder(){
public Command bind(Object v){
final Command c
final Command javacc = new JavaCCommand();
final Command done = new PrintCommand(
return new SeqCommand(c
}
}
);
上面的代碼
接下來
最終
不錯
唯一一個問題
這還是很簡單的情況
看來
那麼
寫偽碼
java代碼:
time <
print time
javac
我們的目標是
幸好
java代碼:
do {time=now} $
info
javac {classpath=
info
這些do
更加復雜的邏輯
java代碼:
auto (info
do {time=now} $
info
do {t
do {t
let
diff = t
writeFile
end
這段腳本要先讀取當前時間
auto函數的意思是
你如果感興趣可以試著用java或者groovy寫寫
如此
最後
你可以參與這個框架核心的搭建(跟我合作)
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28218.html