2014-09-30 63 views
3

我創建了一個java註釋,它將我的一些'服務'類標記爲服務,然後編寫一個註釋處理器來生成相應的servicerequest和servicehandler類。這是一個GWT maven項目,在這個項目中,服務請求被髮送到服務器到中央調度程序,由各種服務處理。如何讓java註釋處理器讀取並處理來自projectA的註釋並生成projectB的java源文件

我的maven項目由一個父項目和5個子項目組成。

這個項目的結構是這樣的:

  • MoodleMobile(父Maven項目)
    • gwtMoodleWS(GWT層)
    • moodleBuildSupport(包含註釋處理r)的
    • moodleGeneratedServiceHandlers(生成的類的期望位置)
    • moodleWS(服務器側層)
    • moodleWSAPI的代碼(位置,其中註釋處理器將運行)

我的問題是這樣的。

使註解處理器讀取和處理來自一個項目(moodleWSAPI)的註釋並在另一個項目(moodleGeneratedServiceHandlers)中生成Java源文件的規定方式是什麼?

我看到很多很多註釋處理器的例子都是爲註釋處理器運行的同一個項目生成java源文件,但是不是用於不同的項目。

我已經成功地構建和測試了我的註釋處理器,但是我無法弄清楚如何讓它生成處理器運行的項目之外的文件。目前它生成的moodleWSAPI中的java源文件這是錯誤的)。我希望它在moodleWSAPI中處理源文件,然後在moodleGeneratedServiceHandlers中輸出新生成的源文件。

這裏是代碼片段,我要創建實際的Java源文件..

public void createSourceFileFromTemplate(Template template, ClassSignature classSignature, VelocityContext context, Element element) { 
     PrintWriter pw = null; 
     try { 
      JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(classSignature.getFullName(), classSignature.getElement()); 
      OutputStream fileStream = sourceFile.openOutputStream(); 
      pw = new PrintWriter(fileStream); 
      template.merge(context, pw); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      if (element!=null) { 
       processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(),element); 
      } else { 
       processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage()); 
      } 
     } finally { 
      if (pw!=null) { 
       pw.close(); 
      } 
     } 
    } 

請注意:ClassSignature是我來捕獲類的類名只是我的自定義類。我使用Velocity作爲我的模板引擎來生成實際的Java源代碼。

我在processEnv.getFiler()規範中沒有看到任何內容,它允許我指定項目之外的輸出。

我能去不使用processingEnv.getFiler()。createSourceFile(..)的路線,只是建立使用簡單的Java文件IO Java源文件。這將是很輕鬆的事,但我想行內的色彩,可以這麼說,並完成在規定的方式我的需要。有任何想法嗎 ?

回答

4

我不認爲這是爲在其他項目中使用創建文件的任何特殊的API。至於處理器而言(或甚至爪哇一般)沒有這樣的事情「項目」 - 已提供給編譯器是已知的僅輸入和輸出路徑。

使用FilerStandardLocation有助於處理器的便攜性,避免擔心開發環境的目錄結構。如果處理器將只在這一個項目中使用,是不是真的需要這種可移植性和應該使用直接文件IO沒有壞處,因爲你知道你的模塊究竟是如何構成的。

爲了使這個更習慣一點,您可以將其他項目的源目錄的位置作爲compiler options傳遞給帶有-Akey[=value]選項的註釋處理器。這至少會移動對代碼中其他項目結構的任何假設,並將責任保留到構建工具的這些路徑。 Maven最清楚項目的結構如何,所以我認爲這將是一個很好的解決方案。

+0

我認爲你有一個很好的解決方案有,我可能會走這條路。我只需要編寫(或查找)一些基於完整類名創建文件的代碼。一旦完成,我就參加比賽。感謝您的建議。 – 2014-10-01 11:10:40