我怎样才能让蚂蚁使用JAXB 2.2.x的,而不是对Java SE 6 JAXB类中的javac?(

2019-08-06 04:18发布

我在更新遗留应用程序使用Java SE 6,而不是Java 5的SE的过程。 该应用程序使用JAXB,并在Java 5的SE它具有类路径的JAXB参考实现罐子。 当我移动到Java SE 6(更新38),我打了几个凸块(见链接问题#1 ),我有一些帮助解决。

所以这是造成麻烦,接下来的事情是该项目的Ant构建脚本。 当蚂蚁编译执行任务,它拿起JAXB的嵌入式版本附带的Java SE 6,而不是从我已经包含在类路径中(JAXB的2.2.6版本)的罐子版本。 我相信的Java SE 6 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构建脚本,以便从构建类路径,而不是被包装在Java SE 6 JDK中的类拿起JAXB 2.2.6罐子?


更新:根据彼得的回答解决方案

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

Answer 1:

我相信赞同库文件夹的概念是你的朋友。

即切换:

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

存在于批准的那些罐子被认为PRIO来加载的任何其他类(我相信)。

有关更完整的样本看正确答案: 如何使蚂蚁更喜欢类来自JDK类链接的JAR?



Answer 2:

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

<compilerarg value="-cp path_to_jaxb2_jar"/>

这将是足够的,JAXB将自动从JAR的META-INF /服务disover通过信息的新JAXB提供商/并使用它,而不是默认的内部供应商。 见JAXBContext.newInstance API“JAXB实现的发现”



文章来源: How can I make Ant use JAXB 2.2.x instead of Java 6 SE JAXB classes in javac?