2

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

在这种情况下,JAXB 2.1.x 中的 @XmlElementRef 不存在“必需”属性,但在 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>
4

2 回答 2

5

我相信认可库文件夹的概念是你的朋友。

即开关:

<compilerarg value="-Djava.endorsed.dirs=/some/path/lib/endorsed"/>

认可中存在的那些罐子将被视为优先于任何其他加载的类(我相信)。

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

于 2013-01-09T13:10:07.430 回答
0

只需将 jaxb 2.2 实现(例如 jaxb-impl.2.2.5)添加到编译器的类路径

<compilerarg value="-cp path_to_jaxb2_jar"/>

这已经足够了,JAXB 将通过来自 jar 的 META-INF/services/ 的信息自动发现新的 JAXB 提供程序,并使用它而不是默认的内部提供程序。请参阅 JAXBContext.newInstance API“发现 JAXB 实现”

于 2013-01-09T13:30:09.547 回答