3

我几乎没有自己的 API,总共有大约 2000 个类。其中一些使用Path来自 JDK7 的新 API。然而,大多数其他类依赖任何新的 JDK API 或新的语言特性。所以大多数类都可以在 JDK6 环境中使用(我打算这样做)。假设,我已经用@Java7Only.

我现在需要的是一种或多或少地自动创建我所有项目的仅 JDK6 子集的方法,而无需引入新版本分支或产品线(维护起来太复杂)。

所有项目都是使用 Netbeans 创建的,因此使用 Ant。许多项目依赖于其他项目。

请帮我评估一下,根据我的问题,哪些想法最合适。每个想法可能会出现哪些问题?

所有想法的共同第一步

  • 让注释处理器搜索带注释的@Java7Only类并将列表存储到properties文件中。

想法1(具体)

  • 编写一个工具,该工具将使用该properties文件递归地复制整个项目,但 JDK7 文件除外。
  • 通过调用 ant 使用 JDK6 构建复制的项目,从而得到一个 JDK6 兼容的 jar。

想法2(具体)

  • 编写第二个注释处理器,它将使用该properties文件将除 JDK7-only 文件之外的所有内容传递给 JavaCompiler 实例。
  • 要么使用 Java API 构建一个 jar,要么为此使用 Ant API。

(这将是一个仅限 Java 的想法,但可能太复杂了)

想法 X(摘要)

  • 以某种方式影响 Ant 构建过程(通过覆盖某些目标?)以及对于每个 JDK6 兼容的类:让 Ant 编译它的两个版本(一次使用 JDK6 编译器,另一次使用 JDK7 编译器)。
  • (当然,JDK7 类只编译一次,使用 JDK7 编译器)
  • 将每一束包装到一个单独的罐子中。

这些想法可能存在的常见问题

  • 一些项目依赖于其他项目,所以一些动作(比如打包)应该考虑到这一点。
  • 请记住:JDK7 编译器生成向下不兼容的类文件,这就是为什么每个可能的想法都必须发生在源代码级别(在构建过程之前或之中,而不是之后)。
4

2 回答 2

1

这只是部分适用,但我想我还是会提到它。

仅使用 -source 1.6 -target 1.6 选项进行验证的问题在于,当使用 JDK 7 编译时,您仍然可以使用 Java 7 API。

我现在已经在几个项目中使用了Animal Sniffer Maven Plugin ,事实证明它非常有用。此插件扫描您的类的字节码以了解 JDK API 的使用情况。也就是说,如果您在以 JDK 6 为目标时尝试使用 JDK 7 API,则可以告诉它构建失败。这对于根据需要分离类没有多大帮助,但作为最终验证步骤与 - source 1.6 -target 1.6 编译器选项。

如Animal Sniffer 主页所述,还有一个动物嗅探器 Ant 插件。

于 2011-07-05T01:52:28.030 回答
1

我对想法 2 的看法:

本质上,这是在编译器中调用编译器。注释处理器作为编译的一部分运行。这可以安全地完成吗?Sun 的 javac 中是否存在任何会导致问题的静态状态。(我不知道答案,但从记忆中可能有一些静态状态可能会在这种情况下导致问题)。

想法 1 对我来说似乎更简单更好。

但是退后一步,是否可以将所有 JDK 7 特定的东西分离到一个单独的模块中,然后分别编译到不同的 JAR 中?

  • 拥有使用 JDK 6 编译的“主”项目(JDK 7 读取不会有问题,因为它向后兼容)
  • JDK 7 特定模块的源代码位于不同的目录中,其中包括编译类路径上的“主”JAR,可以单独构建,如有必要,可以使用不同的 build.xml。
于 2011-07-05T02:01:14.937 回答