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



我正在更新一个遗留应用程序,以使用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中的@XmlElementRef不存在'required'属性。

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


UPDATE:基于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>

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

即开关:

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

我认为,在已加载的任何其他类之前,应该优先考虑这些jar。

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

只需将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实现"

相关内容

  • 没有找到相关文章

最新更新