繁体   English   中英

如何在Javac中使Ant使用JAXB 2.2.x代替Java 6 SE JAXB类?

[英]How can I make Ant use JAXB 2.2.x instead of Java 6 SE JAXB classes in javac?

我正在更新旧版应用程序以使用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包含JAXB2.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中打包的类?


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

<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"/>

认可的罐子应视为装载的任何其他类的罐子(我相信)。

有关更完整的示例,请参见以下正确答案: 如何使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实现”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM