【问题标题】:Can I specify the JDK path to compile against within an Ant build.xml?我可以在 Ant build.xml 中指定要编译的 JDK 路径吗?
【发布时间】:2011-06-26 12:58:20
【问题描述】:

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

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


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

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

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

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

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

【问题讨论】:

    标签: ant build java javac jdk1.6


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,好点子。。虽然我知道在独立运行 javac 时会推断出 JDK 路径,但 Ant 文档在这方面还远不清楚。。你能确认可执行文件+fork 组合是“相当于设置运行 Ant 之前的 JAVA_HOME?” (请更新答案)+1
    • 在 Java6 中 fork=true 是否昂贵?
    【解决方案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" />  
    

    【讨论】:

    • 但这并不能防止开发人员无意中使用 1.6 JDK 类(例如 NavigableMap)。只有在 JDK 1.5 下运行时才会在运行时捕获此错误...哎呀!解决这个问题的一种方法是使用 bootclasspath。或者直接使用 JDK 1.5 编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多