Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Ant build.xml中指定要编译的JDK路径吗?_Ant_Build_Java_Javac_Jdk1.6 - Fatal编程技术网

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

我可以在Ant build.xml中指定要编译的JDK路径吗?,ant,build,java,javac,jdk1.6,Ant,Build,Java,Javac,Jdk1.6,我希望将JDK1.6用于项目的一个分支,而其他人则继续使用JDK1.5。开发人员希望偶尔在这两者之间切换 那么,判断使用哪个JDK的最佳方法是什么?我所说的“最佳”是指健壮、透明、低维护、与源代码一起进行版本控制(Ant本身和JDK当然不是,但它们生活在标准位置) 我想,在Ant之外有一个明显而不是最好的方法:不断更改JAVA_HOME env变量。然而,这需要开发人员手动切换(另一件要记住的事情:容易出错),一个改变所有多构建服务器(现在我需要做更多的工作) 寻找一些简单的javac属性,例

我希望将JDK1.6用于项目的一个分支,而其他人则继续使用JDK1.5。开发人员希望偶尔在这两者之间切换

那么,判断使用哪个JDK的最佳方法是什么?我所说的“最佳”是指健壮、透明、低维护、与源代码一起进行版本控制(Ant本身和JDK当然不是,但它们生活在标准位置)


我想,在Ant之外有一个明显而不是最好的方法:不断更改JAVA_HOME env变量。然而,这需要开发人员手动切换(另一件要记住的事情:容易出错),一个改变所有多构建服务器(现在我需要做更多的工作)

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

  • 编译器
    ——这很公平,但文档中说“现代:…javac1.5和javac1.6..作为别名”。。对我来说,这意味着它不会有任何区别,是吗
  • source
    -似乎只与JLS版本相关(尽管从上面链接的文档中没有%100清楚)
  • 目标
    -字节码版本
  • bootclasspath
    -一些SO答案提到了这一点,但非常不清楚,似乎有点骇人听闻
  • 可执行文件
    -指向javac的路径,但不是指向libs的路径--似乎是最接近的匹配,隐式指定JDK路径?更新:由JB Nizet确认
  • fork
    -这里似乎需要true(否则它会忽略上面的内容而不会出错?)。更新:与默认值相比,有任何性能影响吗?(我想现在JVM的启动时间更好了,但仍然如此)
因此,这些似乎都没有帮助。。这两者的任何组合是否等同于在运行Ant之前设置JAVA_HOME


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

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


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

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


谢谢,说得好。。虽然我知道JDK路径是在独立运行javac时推断出来的,但Ant文档在这方面还很不清楚。。您能否确认executable+fork组合“相当于在运行Ant之前设置JAVA_HOME?”(请更新答案)+1is fork=true在Java6中非常昂贵?但这并不能防止开发人员无意中使用1.6 JDK类(例如NavigableMap)。这个错误只有在JDK1.5下运行时才会被捕获…哎哟!解决这个问题的一种方法是使用bootclasspath。或者只使用JDK1.5进行编译。