【问题标题】:Java - Using Ant to automatically generate boilerplate codeJava - 使用 Ant 自动生成样板代码
【发布时间】:2012-11-01 21:46:05
【问题描述】:

简介: 我在尝试、失败和沮丧之前问这个问题,因为我对 Apache Ant 的经验为零。一个简单的“是的,这会起作用”就足够了,或者如果不起作用,请告诉我什么会起作用。

情况: 我正在开发一个使用 JavaFX 创建 GUI 的项目。 JavaFX 依赖于类似 Java Bean 的对象,这些对象的属性需要大量样板代码。例如,我想要的所有功能都是一个名为 nameString,默认值为 "Unnamed",或者采用最小的 Java 语法:

String name = "Unnamed";

在 JavaFX 中,为了提供相同的功能,最少的代码量会增加很多(在这种情况下,功能对我来说意味着我可以设置和获取某个变量以在我的程序中使用):

private StringProperty name = new StringProperty("Unnamed");
public final String getName() { return name.get(); }
public final void setName(String value) { name.set(value); }

问题:我可以使用 Ant 生成这个样板代码吗?

似乎可以使 Ant 脚本充当 (Java) 预处理器。例如,通过使用正则表达式替换 (https://ant.apache.org/manual/Tasks/replaceregexp.html) 函数。我正在考虑我的代码中与此类似的代码行,然后它们将被自动替换:

<TagToSignifyReplaceableLine> StringProperty person "Unnamed"

最后的评论:正如我之前所说,我以前从未使用过 Ant,所以我想与您核实一下 1) 是否可以这样做,以及 2) 这是否是一个好方法去做吧,或者如果有更好的方法。

谢谢!

【问题讨论】:

    标签: java ant code-generation building precompile


    【解决方案1】:

    是的,可以做到:-)

    我曾经编写过一个 Web 服务适配器,它使用 WSDL 文档(描述基于 SOAP 的 Web 服务的 XML 文件)来生成 POJO Java 类,该类实现了我的产品的功能接口。导致我这样做的原因是与我们的专有系统对话所必需的盲目重复的 Java 代码。

    技术解决方案使用 XSLT 样式表将输入 XML 文档转换为输出 Java 文本文件,该文件随后由 ANT 编译。

    <!-- Generate the implementation classes -->
    <xslt force="true" style="${resources.dir}/javaServiceStub.xsl" in="${src.dir}/DemoService.wsdl" out="${build.dir}/DemoService/src/com/myspotontheweb/DemoServiceSkeleton.java" classpathref="project.path">
        <param name="package" expression="com.myspotontheweb"/>
        ..
        ..
    </xslt> 
    

    不幸的是,XSLT 是最接近原生 ANT 支持的模板引擎的东西。

    祝你好运!

    【讨论】:

      【解决方案2】:

      我会特别看一下 JSR-269:genftw 这使得 JSR-269 更容易......

      是的,它可以与 Ant 一起使用,甚至无需编写插件,并且比脆弱的 RegEx 更好。

      如果您真的喜欢冒险,另一个选择是查看XText 以生成代码,但它相当复杂。

      【讨论】:

        【解决方案3】:

        是的,可能。您甚至可以实现自己的 Ant 任务,这很容易完成。

        在 ant 中是这样的:

        <taskdef name="codegen" classpath="bin/" classname="com.example.CodeGen" />
        

        然后

        <codegen className="Test.java">
           <Property name="StringProperty.name" value="Unnamed"/>
        </codegen>
        

        CodeGen.java 然后是这样的:

        public class CodeGen extends Task {
            private String className = null;
            private List properties = new ArrayList();
        
            public void setClassName(String className) {
                this.className = className;
            }
        
            /**
             * Called by ant for every &lt;property&gt; tag of the task.
             *  
             * @param property The property.
             */
            public void addConfiguredProperty(Property property) {
              properties.add(property);
            }
        
            public void execute() throws BuildException {
                // here we go!
            }
        
        }
        

        【讨论】:

        • 谢谢 Udo,这似乎是最好的答案,但我还没有完全遵循它。这可能是因为我的 Ant 经验为 0,所以我无法“阅读”您提供的 Java 代码会做什么。我会将其标记为答案,如果遇到任何问题,我会在此处发布:)
        【解决方案4】:

        我知道可以做到,因为我以前的公司用ant在java中生成模型对象。

        他们使用的方法是在 XML 文件中定义模型对象并运行 ant 任务来生成 pojo 和 dto。

        我很快搜索了一下,发现有一些工具可以让您从 XML 生成 java。您可能可以在 XML 中提供您的架构/默认值等,并有一个 nt 任务来运行该工具。

        【讨论】:

          猜你喜欢
          • 2011-11-24
          • 1970-01-01
          • 1970-01-01
          • 2012-05-30
          • 1970-01-01
          • 2020-07-02
          • 2017-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多