想給項目做一個Nightly build項目特點如下
使用 Eclipse開發的java和GWT混合項目
目前有多個工程
項目處於初期很多部分尚未穩定因此是工程是工程間依賴工程沒有引用編譯好的jar包
工程主要分為前台clt公共模塊common和服務器模塊svr例如有一個mon一定有Aclt和Asvr依賴於mon但clt和svr間不相互依賴
(這是我們項目的編譯過程的特殊邏輯)
以下是選定的技術路線
因為編譯帶有特殊的邏輯所以使用方便編程的java而非純ant腳本
不想自己整理工程的編譯順序太多麻煩所以使用了domj讀取eclipse工程配置信息
不用ant腳本可以使用Java程序調用Ant API
由於javac對模板的不友好 所以使用jdt
例如以下的代碼
<! <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />;br/ /><br/ />>package demoserver;
import comextjsgxtuiclientdataBaseModel;
public class TestA extends BaseModel {
@Override
public < X > X get(String property) {
return super get(property);
}
}
使用javac編譯就會出現
無法確定 <X>X 的類型參數對於上限為 XjavalangObject 的類型變量 X不存在唯一最大實例
雖然搜索了以下說只要返回值強制轉換一下就ok即return (X)super get(property);
但這樣的代碼也比較多明明在eclipse編譯通過的在javac就不行所以g了一下才知道 eclipse有自己的編譯器(?不太確認javac和jdt的關系)叫jdt
首先要從Eclipse中抽取出一個JDT的包在Eclipse/plugin目錄下找到一個re _v__Rxjar(版本社麼的沒有關系)用winrar解壓出裡面的一個jdtCompilerAdapterjar包然後從工程中引用它
順便把
pilertool_v__Rxjar
re_v__Rxjar
orgeclipsejdtdebugui_v_rjar
這幾個包也從eclipse/plugin中引用到項目裡——為什麼要單獨解壓jdtCompilerAdapterjar我不太清楚啊
然後由於要調用ant所以從apache上的ant項目中下載用到兩個包
antjar
antlauncherjar
使用以下代碼調用ant
<! <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />;br/ /><br/ />>package thssplatformutilmrobuild;
import javaioFile;
import orgapachetoolsantProject;
import orgapachetoolsanttaskdefsJavac;
import orgapachetoolsanttaskdefsJavacImplementationSpecificArgument;
import orgapachetoolsanttypesPath;
public class JavaBuilder {
public JavaBuilder() {
}
public void execute(Path classPath File output) {
Project currentProject = new Project();
// 填寫工程的絕對目錄這樣後面可以使用相對目錄
currentProjectsetBaseDir( new File( 這裡是工程的絕對目錄 ));
Javac compileJava = new Javac();
compileJavasetProject(currentProject);
// 調用jdt編譯器
compileJavasetCompiler( reJDTCompilerAdapter );
compileJavasetClasspath(classPath);
compileJavasetEncoding( UTF );
// 填寫相對目錄src
compileJavasetSrcdir( new Path(currentProject src ));
// 編譯後的結果class輸出到哪裡
compileJavasetDestdir(output);
compileJavasetTarget( );
compileJavasetSource( );
compileJavasetNowarn( true );
compileJavasetDebug( true );
compileJavasetDebugLevel( linessource );
// javac需要這段換成了jdt不知道要不要了
ImplementationSpecificArgument arg = compileJavacreateCompilerArg();
argsetLine( Xlint );
compileJavaexecute();
}
}
可能上述文章有很多概念性的問題例如我沒有搞清的javac和jdt關系但是問題確實是解決了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26049.html