2012-03-01 23 views
3

我有一個java枚舉,用於我的web應用程序。我也有很多涉及枚舉值的JavaScript代碼。這將是理想的如果我可以從枚舉中生成一個JavaScript文件作爲Maven構建過程的一部分。有沒有人知道解決這個問題或解決問題的優雅方法的項目? 謝謝!從java類生成JavaScript作爲maven構建步驟

回答

2

事實證明,使用groovy maven插件作爲「準備包」階段有很好的方法。 這是代碼: 在你的pom.xml添加此項:

<plugin> 
       <groupId>org.codehaus.groovy.maven</groupId> 
       <artifactId>gmaven-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>script-prepare-package1</id> 
         <phase>prepare-package</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <source>${basedir}/src/main/groovy/GenerateJavaScriptEnum.groovy</source> 
         </configuration> 
        </execution> 

       </executions> 
      </plugin> 

這是Groovy腳本,GenerateJavaScriptEnum.groovy,怎麼看起來像:

def fields = [] 


com.foo.bar.YourEnum.values().each() { f-> 
    fields << "${f.name()} : \"${f.getId()}\"" 
} 

if (fields) { 
    log.info("Generating Javascript for com.foo.bar.YourEnum") 

    [ 
      new File("${project.build.directory}/${project.build.finalName}/js"), 
      new File("${project.basedir}/src/main/webapp/js") 
    ].each() { baseOutputDir-> 
     if (!baseOutputDir.exists()) { 
      baseOutputDir.mkdirs() 
      log.info("Created output dir ${baseOutputDir}") 
     } 

     def outfile = new File(baseOutputDir, "YourEnum.js") 

     log.info("Generating ${outfile}") 

     def writer = outfile.newWriter("UTF-8") 
     writer << "// FILE IS GENERATED FROM com.foo.bar.YourEnum.java.\n" 
     writer << "// DO NOT EDIT IT. CHANGES WILL BE OVERWRITTEN BY THE BUILD.\n" 
     writer << "YourEnum = {\n" 
     writer << fields.join(",\n") 
     writer << "\n}" 
     writer.close() 
    } 
} 
2

我有同樣的問題,並最終創建一個自定義標籤,讓我來遍歷在我的JSP中的枚舉,

public static Enum<?>[] getValues(String klass) { 
    try { 
     Method m = Class.forName(klass).getMethod("values", (Class<?>[]) null); 
     Object obj = m.invoke(null, (Object[]) null); 
     return (Enum<?>[]) obj; 
    } catch (Exception ex) { 
     return null; 
    } 
} 

然後在我的jsp我只是做,

var MyEnum = [ 
<c:forEach var="type" items="${foocustomtags:enumiter('com.foo.MyEnum')}"> 
    '${type.value}': '${type.text}', 
</c:forEach> 
]; 
+0

這是非常有用的,它upvoted ,但我仍然喜歡有一些代碼生成,以便我能夠從JavaScript代碼中刪除所有魔法字符串。謝謝! – 2012-03-01 21:53:59