熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java調用Eclipse的編譯器JDT

2013-11-23 18:58:02  來源: Java核心技術 

  想給項目做一個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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.