java - 如何让 Ant 在 javac 中使用 JAXB 2.2.x 而不是 Java 6 SE JAXB 类?

标签 java ant jaxb classpath

我正在更新旧应用程序以使用 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/

相关文章:

ant - 使用 Ant 1.8 扩展点支持父构建的惯用语

Android:释放时删除未使用的资源

namespaces - 编码后缺少 JAXB 命名空间

java - 在java中使用字符串元素对集合进行排序

java - 谷歌应用引擎 : couldn't start server - jetty

java - 如何在不使用 "%"运算符的情况下计算两个数字的余数/模?

java - maven 。轮廓。属性和 System.getProperty()

java - 如何在 Java SE 应用程序的 Netbeans native 打包中添加其他文件/文件夹

java - JAXB 绑定(bind)嵌套元素

java - 将 LocalDateTime 与 JAXB 结合使用