7

我想将 JDK 1.6 用于项目的一个分支,而其他人继续使用 JDK 1.5。开发人员希望偶尔在这些之间切换。

那么告诉Ant 的 javac使用哪个 JDK最好的方法是什么?最好,我的意思是健壮、透明、低维护,与源代码一起进行版本控制(Ant 本身和 JDK 肯定不是,但它们存在于标准位置)。


我猜想显然不是最好的方法是在 Ant 之外:不断更改 JAVA_HOME 环境变量。然而,这将需要开发人员手动切换(要记住的另一件事:容易出错),更改所有 -many-build 服务器(现在对我来说还有更多工作)。

寻找一些简单的 javac 属性,例如jdk-path,我注意到了几个(感谢在网上和 SO 中阅读):

  • compiler- 很公平,但文档说“现代:.. javac1.5 和 javac1.6 .. 作为别名”.. 对我来说,这表明它不会有任何区别 - 会吗?
  • source- 似乎只与 JLS 版本有关(尽管上面链接的文档中没有 %100 明确)
  • target- 字节码版本
  • bootclasspath- 一些 SO 答案提到了这一点,但很不清楚,而且看起来很骇人听闻
  • executable- javac 的路径,但不是 libs.. - 似乎是最接近的匹配,隐式指定 JDK 路径?更新:由 JB Nizet 确认
  • fork- 看来我在这里需要 true (否则它会忽略上述内容而不会出错?)。更新:任何性能影响与默认值?(我猜这些天 JVM 启动时间更好,但仍然如此)

因此,似乎这些本身没有任何帮助..这些的任何组合是否等同于在运行 Ant 之前设置 JAVA_HOME ?

我想到了一些技巧(例如,在每个平台上包装 ant 可执行文件只是为了设置那个 env var - 非常可悲),但我真的希望我错过了一些东西 :)

4

2 回答 2

3

使用可执行属性需要将fork属性设置为true。这意味着javac ant 任务将启动一个外部进程来执行javac。

当您手动启动 javac 时,您不必指定任何特定的 JDK lib 目录:它知道在哪里可以找到它所在的 JDK 的库。如果你通过 ant 的 javac 任务启动它,我会说它会是一样的(除非你覆盖引导类路径)。

于 2011-02-13T18:49:01.753 回答
2

使用哪个版本的 JDK 来编译类不一定重要。特定 JDK 编译资源的方式可能存在差异,但如果差异仅在 v1.5 和 v1.6 之间,您可以使用 1.6 JDK 编译代码以与 Java 1.5(甚至 1.1)兼容。

target您可以使用该属性 控制要编译的 JVM 版本:

<javac srcdir="${src}" 
       destdir="${build}" 
       fork="true" 
       source="1.5" 
       target="1.6" />  
于 2011-02-13T22:33:08.867 回答