我想将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 - 非常难过),但我真的希望我错过了一些东西:)
答案 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" />