1

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

情况: 我正在开发一个使用 JavaFX 创建 GUI 的项目。JavaFX 依赖于类似 Java Bean 的对象,这些对象的属性需要大量样板代码。例如,我想要的所有功能都是一个名为name的字符串,默认值为"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 生成这个样板代码吗?

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

<TagToSignifyReplaceableLine> StringProperty person "Unnamed"

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

谢谢!

4

4 回答 4

0

是的,可以做到:-)

我曾经编写了一个 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 支持的模板引擎的东西。

祝你好运!

于 2012-11-13T18:49:12.447 回答
0

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

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

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

于 2012-11-13T13:33:16.480 回答
0

是的,可能。您甚至可以实现您自己的 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!
    }

}
于 2012-11-13T13:18:22.087 回答
0

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

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

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

于 2012-11-13T13:03:42.990 回答