2012-03-01 22 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