Java Emitter Templates(JET)是 EMF 內建的代碼生成框架,語法與 JSP 幾乎相同,但輸出目標為 Java 類別、設定檔或任意文本文件。核心特性:
<%= ... %>、腳本片段 <% ... %>、邏輯控制流JETExample,源資料夾設為 srctemplates 目錄src<%@ jet
package="com.ibm.pdc.example.jet.gen"
class="GenDAO"
imports="java.util.* com.ibm.pdc.example.jet.model.*"
%>
<% GenDBModel genDBModel = (GenDBModel)argument; %>
package <%= genDBModel.getPackageName() %>;
public class <%= genDBModel.getClassName() %>DAO {
// 生成的 DAO 類別內容...
}
關鍵指令:jet 指令定義生成的模板類別元數據(套件、類名、匯入),而非輸出內容。
stringBuffer (StringBuffer):累積輸出內容argument (Object):呼叫端傳入的參數物件,通常於開頭轉型右鍵模板檔 → Compile Template,將於指定套件生成 GenDAO.java,包含 generate(Object argument) 方法。執行該方法即可獲得渲染後的代碼字串。
<%@ include file="copyright.inc" %>
將版權聲明等通用內容置於 .inc 檔,編譯時內聯至模板。副檔名避免使用 .jet 防止被誤編譯。
預設骨架僅包含 generate() 方法。建立 custom.skeleton:
public class CLASS {
private java.util.Date getDate() {
return new java.util.Date();
}
public String generate(Object argument) {
return "";
}
}
於模板 jet 指令加入 skeleton="custom.skeleton"。可用於:
extends MyGenerator)generate() 簽名與回傳型別注意:JET 實際替換的是骨架中最後一個方法的主體,編輯骨架時務必保留此結構。
String base = Platform.getPlugin(PLUGIN_ID).getDescriptor().getInstallURL().toString();
String uri = base + "templates/GenTestCase.javajet";
MyJETEmitter jetEmitter = new MyJETEmitter(uri);
jetEmitter.addClasspathVariable("JET_EXAMPLE", PLUGIN_ID);
String generated = jetEmitter.generate(new NullProgressMonitor(), new Object[]{genClass});
關鍵點:標準 JETEmitter 假設運行於插件環境,需繼承並覆寫 initialize() 注入類別路徑,解決生成代碼編譯時的依賴解析問題。
plugins/org.eclipse.emf.codegen_1.1.0/test 提供的無頭模式腳本jetc 任務支援 template 或 fileset 屬性,配置 classpath 後即可批量編譯<%@ jet
package="com.ibm.pdc.example.jet.gen"
class="JspGen"
imports="java.util.*"
startTag="[%"
endTag="%]"
%>
[% String argValue = (String)argument; %]
package [%= argValue %];
將分隔符改為 [% ... %] 避免與 JSP 原生 <% ... %> 衝突,表達式語法相應為 [%= ... %]。
JET 將 JSP 的模板範式引入代碼生成領域,提供預編譯與運行時編譯雙重模式,骨架機制賦予高度客製化彈性。下一篇將介紹 JMerge 如何實現生成代碼與手動修改的共存,構建完整的模型驅動開發流程。