генерировать javascript из класса java как шаг сборки maven - PullRequest
3 голосов
/ 01 марта 2012

У меня есть Java-перечисление, которое используется в моем веб-приложении.У меня также есть много кода JavaScript, который ссылается на значения перечисления.Было бы идеально, если бы я мог сгенерировать файл javascript из enum как часть процесса сборки maven.Кто-нибудь знает о проекте, который решает эту проблему или о элегантном способе ее решения?Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 апреля 2012

Оказывается, что есть отличный способ сделать это, используя плагин 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 голосов
/ 01 марта 2012

У меня была та же проблема, и в итоге я создал собственный тег, который позволил бы мне перебирать перечисление в моем 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>
];
...