我可以在Ant build.xml中指定要编译的JDK路径吗?

时间:2011-02-13 18:31:51

标签: ant build java javac jdk1.6

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

那么告诉Ant's javac使用哪个JDK的最佳方式是什么?最好的,我的意思是强大,透明,低维护,与源代码一起版本化(Ant本身和JDK肯定不是,但它们生活在标准位置)。


我认为显而易见的不是最好的方式是在Ant之外:不断更改JAVA_HOME env变量。然而,这将需要开发人员手动切换(另一件事要记住:容易出错),更改所有--man-build服务器(现在为我工作更多)。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用哪个版本的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" />