并不是说它们比任何其他替代方案更好,但它们是一个标准,并且它们是其他任务中始终使用的标准。代码只有在符合这些标准后才能纳入数据库。
如果您正在为个人或组织使用编写任务,您可以自由使用任何您喜欢的风格。但是,使用 Sun Java 风格将帮助您熟悉 Ant 的其余源代码,这可能很重要。
一个重要的规则是“不使用制表符”。使用四个空格代替。不是两个,不是八个,而是四个。即使您的编辑器配置为使用四个空格的制表符,许多其他编辑器却没有。空格在编辑器和平台之间具有更高的一致性。一些 IDE(JEdit)可以突出显示制表符,以防止您意外插入它们。
在主 ant 目录中有一个 Ant 构建文件 check.xml,它在 Ant 的源代码上运行 checkstyle。
Ant 1.x 任务在属性命名方面非常不一致——一些任务使用source,而其他任务使用src。以下是首选属性名称列表
failonerror | 布尔值,用于控制执行失败是否应该抛出BuildException或只打印错误。参数验证失败应始终抛出错误,无论此标志如何。 |
destdir | 输出的目标目录 |
destfile | 输出的目标文件 |
srcdir | 源目录 |
srcfile | 源文件 |
是的,这是一个非常简短的列表。至少尝试与核心任务保持大致一致。
Ant 中的另一个常见的重用机制是让一个任务创建和配置另一个任务。这相当简单。Ant 的 API 中提供了设施,使任务能够通过其熟悉的名称(“java”、“exec”等)进行实例化。建议您不要使用这种方法,因为用户完全有可能覆盖了该名称以指向完全不同的类。使用直接构造函数调用(或反射)来实例化您的子任务。从 Ant 1.6.3 开始,您可以调用org.apache.tools.ant.Task#bindToOwner()
来将辅助任务“掩盖”为其父任务。
有问题的是依赖于比当前基线更新的 Java 版本中的功能的代码,例如java.nio.file.Path在 JDK 7 中。还要注意较旧类中添加的方法;这些方法不能被任何代码直接使用,并且仍然能够在较旧的系统上编译和运行。如果要使用现有类中的新方法,则必须通过反射使用它,并且NoSuchMethodException以某种方式处理。
如果代码在较旧版本的 Java 上根本无法工作怎么办?它可能会发生。将任务作为可选任务可能没问题,通过 build.xml 修改将编译限制为更新的 JDK(或更高版本)。更好的是,使用反射在运行时链接到类。
类似的考虑适用于新的语言特性,例如 JDK 7 字符串 switch 语句。
我们绝对不能做的一件事是移动或删除现有的任务。请记住,Ant 具有 Java API 以及 XML 语言。我们不想破坏该 API,也不想破坏任何子类化现有 Ant 任务的内容。重构时,您需要在原始类所在的位置留下 фасады。因此,现有代码不会中断。
一套编写良好的测试用例将在 Ant 任务开发过程中将其破坏,直到代码真正完成。并且,以后出现的每个错误都应该添加一个测试用例来演示问题并修复它。
测试用例是您在开发过程中测试任务的好方法。在 ant 源代码树中简单地调用“build run-test”将运行所有 ant 测试,以验证您的更改是否没有破坏任何东西。要测试单个任务,请使用一次性ant run-single-test -Dtestcase=${testname}
,其中${testname}
是您的测试类的名称。
测试用例也由提交者用来验证更改和补丁是否按预期执行。如果您有测试用例,它会大大提高您的可信度。确切地说,我们讨厌没有测试用例的提交,因为这意味着我们必须自己编写它们。只有在我们需要该任务或它被认为对许多用户至关重要时,才会这样做。
还要记住,Ant 1.x 旨在编译并在 Java 1.2 上运行,因此您应该在 Java 1.2 以及您使用的任何更高版本上进行测试。您应该能够为此目的从 Sun 下载旧的 SDK。
最后,在开始开发项目之前和之后运行完整的build test
,以确保您没有意外地破坏其他任何东西。
您可以使用 proposal/xdocs 中的 xdocs 内容从源代码的 javadoc 自动生成文档页面;这将使生活更轻松,并将使向完全由 xdoclet 生成的文档构建过程过渡变得微不足道。
这一点很重要。
Apache 的相当自由的许可证目前不被认为与自由软件基金会(Gnu 项目)的 GPL 或 Lesser GPL 兼容。这些许可证具有更严格的条款,“版权所有”,这些条款不在 Apache 许可证中。这允许个人和组织在 Apache 库和源代码之上构建商业和闭源应用程序。
由于 Gnu GPL 许可证会立即扩展到涵盖任何包含它的更大应用程序(或在 LGPL 的情况下为库),因此 Ant 团队无法将基于 GPL 或 LGPL 源代码的任何任务合并到 Ant 代码库中。您可以随意提交,但它将被礼貌而坚定地拒绝。
如果您通过 `import` 或反射链接到 GPL 或 LGPL 库,则您的任务必须在相同的条款下获得许可。因此,链接到 (L)GPL 代码的任务不能进入 Apache 管理的代码库。调用此类代码的任务可以使用 `exec` 或 `java` 任务来运行程序,因为您此时只是在执行它们,而不是链接到它们。
即使我们无法将您的任务包含到 Apache 代码库中,我们仍然可以指向您托管它的位置;只需提交一个指向您任务的 xdocs/external.html 的 diff 即可。
如果您的任务直接链接到专有代码,我们遇到了不同的问题:构建任务非常困难。请使用反射。
如果您正在考虑编写一个任务,在列表中发布您想法的说明可能是有益的 - 您将获得其他人的见解,也许还有一些半写好的任务来完成基础工作,所有这些都不需要编写一行代码。
您可以使用以下两种方法之一创建补丁文件(提交者推荐第一种方法)
使用 Ant 为 Ant 生成补丁文件
ant -f patch.xml这将创建一个名为 patch.tar.gz 的文件,其中包含已修改文件的统一 diff,以及已添加的文件。查看文件是否完整且正确。建议使用这种方法,因为它标准化了构建补丁文件的方式。它还消除了您错过提交构成补丁一部分的新文件的可能性。
对现有文件的补丁应使用 `svn diff filename` 生成,并将输出保存到文件中。如果您想获取对目录中多个文件所做的更改,只需使用 `svn diff` 即可。然后,将补丁文件以及您添加的任何新文件打包并压缩。
补丁应作为附件发送到主题为 [PATCH] 的邮件中,并在主题中包含一个独特的单行摘要。文件名/任务和更改通常就足够了。将更改作为附件包含在内非常重要,因为太多邮件程序会重新格式化粘贴的文本,这会破坏补丁。
然后,您等待其中一位提交者提交补丁,如果认为这样做是合适的。错误修复会很快进行,其他更改通常会引发一些讨论,然后才会进行(可能经过修改的)提交。
新提交应以 [SUBMIT] 开头。邮件守护程序会拒绝任何超过 100KB 的邮件,因此任何大型更新都应压缩。如果您的提交大于此,为什么不将其分解为单独的任务呢。
我们还希望将提交添加到 bugzilla 中,这样它们就不会丢失。请先使用有意义的名称提交报告,然后将文件作为附件添加。请使用 CVS diff 文件!
如果您在几周后没有收到任何回复,请提醒邮件列表。有时,非常好的提交会淹没在其他问题的噪音中而丢失。这在产品发布新版本之前尤其如此。在那段时间里,除了错误修复之外的任何内容都可能被忽略。