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

Jim*_*ugh 2 java ant jaxb classpath

我正在更新遗留应用程序以使用Java 6 SE而不是Java 5 SE.该应用程序使用JAXB,在Java 5 SE下,它在类路径上有JAXB参考实现jar.当我转到Java 6 SE(更新38)时,我遇到了一些问题(参见链接的Stackoverflow问题),我在一些帮助下解决了这个问题.

因此,导致问题的下一件事是项目Ant构建脚本.当Ant编译任务执行时,它会获取Java 6 SE附带的JAXB的嵌入式版本,而不是我在类路径中包含的jar版本(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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,JAXB 2.1.x中的@XmlElementRef不存在'required'属性,但它在2.2.x中存在.

如何更改我的Ant构建脚本,以便从构建类路径中获取JAXB 2.2.6 jar而不是Java 6 SE JDK中包含的类?


更新:解决方案基于彼得的答案

<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>
Run Code Online (Sandbox Code Playgroud)

Pet*_*vic 5

我相信背书库文件夹的概念是你的朋友.

即开关:

<compilerarg value="-Djava.endorsed.dirs=/some/path/lib/endorsed"/>
Run Code Online (Sandbox Code Playgroud)

在认可中出现的那些罐子被认为是装载任何其他类别的prio(我相信).

有关更完整的示例,请参阅以下正确答案:如何使Ant更喜欢来自链接JAR而不是JDK类的类?