【问题标题】:generate javascript from java class as a maven build step从 java 类生成 javascript 作为 maven 构建步骤
【发布时间】:2012-03-01 18:50:14
【问题描述】:

我有一个在我的 Web 应用程序中使用的 Java 枚举。我也有很多引用枚举值的 javascript 代码。如果我可以从枚举生成一个 javascript 文件作为 maven 构建过程的一部分,那将是理想的。有谁知道解决这个问题的项目或解决这个问题的优雅方法? 谢谢!

【问题讨论】:

    标签: java javascript maven compiler-construction build-process


    【解决方案1】:

    事实证明,使用 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>
      ];
      

      【讨论】:

      • 这非常有用,所以点赞,但我仍然希望生成一些代码,以便能够从 javascript 代码中删除所有魔术字符串。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多