我正在更新旧应用程序以使用 Java 6 SE 而不是 Java 5 SE。该应用程序使用 JAXB,并且在 Java 5 SE 下,它的类路径上有 JAXB 引用实现 jar。当我迁移到 Java 6 SE(更新 38)时,我遇到了一些障碍(请参阅 linked Stackoverflow question ),我在一些帮助下解决了这些问题。
所以下一个引起麻烦的是项目 Ant 构建脚本。当 Ant 编译任务执行时,它会选择 Java 6 SE 附带的 JAXB 嵌入式版本,而不是我包含在类路径中的 JAXB 版本(JAXB 2.2.6 版本)。我相信 Java 6 SE 包含 JAXB 2.1.x。这会导致编译时错误,如下所示:
[javac] location: @interface javax.xml.bind.annotation.XmlElementRef
[javac] @XmlElementRef(name = "abbrev", type = JAXBElement.class, required = false)
在本例中,JAXB 2.1.x 中的 @XmlElementRef 不存在“required”属性,但在 2.2.x 中存在。
如何更改 Ant 构建脚本,以便它从构建类路径中获取 JAXB 2.2.6 jar,而不是打包在 Java 6 SE JDK 中的类?
更新:基于 Peter 答案的解决方案
<target name="compile" depends="clean">
<javac deprecation="on"
classpathref="prj.classpath"
srcdir="${src}"
destdir="${build.dir}"
debug="on"
debuglevel="lines,vars,source"
source="1.6">
<compilerarg value="-Djava.endorsed.dirs=${lib.ext.dir}/jaxb"/>
</javac>
</target>
最佳答案
我相信认可的库文件夹的概念是您的 friend 。
即切换:
<compilerarg value="-Djava.endorsed.dirs=/some/path/lib/endorsed"/>
背书中存在的那些 jar 将被视为优先于加载的任何其他类(我相信)。
有关更完整的示例,请参阅正确答案:How to make Ant prefer classes from a linked JAR over JDK classes?
关于java - 如何让 Ant 在 javac 中使用 JAXB 2.2.x 而不是 Java 6 SE JAXB 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14235862/