Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Ant在javac中使用JAXB2.2.x而不是Java6SE JAXB类?_Java_Ant_Jaxb_Classpath - Fatal编程技术网

如何让Ant在javac中使用JAXB2.2.x而不是Java6SE JAXB类?

如何让Ant在javac中使用JAXB2.2.x而不是Java6SE JAXB类?,java,ant,jaxb,classpath,Java,Ant,Jaxb,Classpath,我正在更新一个遗留应用程序以使用Java6SE而不是Java5SE。该应用程序使用JAXB,在Java5SE下,它在类路径上有JAXB参考实现JAR。当我转到Java6SE(更新38)时,遇到了一些问题(请参阅),我在一些帮助下解决了这些问题 因此,接下来引起麻烦的是ProjectAnt构建脚本。当Ant编译任务执行时,它会选择Java 6 SE附带的JAXB嵌入式版本,而不是我在类路径(JAXB 2.2.6版本)中包含的JAR版本。我相信Java6SE包括JAXB2.1.x。这会导致编译时错误

我正在更新一个遗留应用程序以使用Java6SE而不是Java5SE。该应用程序使用JAXB,在Java5SE下,它在类路径上有JAXB参考实现JAR。当我转到Java6SE(更新38)时,遇到了一些问题(请参阅),我在一些帮助下解决了这些问题

因此,接下来引起麻烦的是ProjectAnt构建脚本。当Ant编译任务执行时,它会选择Java 6 SE附带的JAXB嵌入式版本,而不是我在类路径(JAXB 2.2.6版本)中包含的JAR版本。我相信Java6SE包括JAXB2.1.x。这会导致编译时错误,如下所示:

[javac] location: @interface javax.xml.bind.annotation.XmlElementRef
[javac]     @XmlElementRef(name = "abbrev", type = JAXBElement.class, required = false)
在本例中,jaxb2.1.x中@xmlementref的中不存在“required”属性,但它在2.2.x中存在

如何更改Ant构建脚本,使其从构建类路径而不是Java 6 SE JDK中打包的类中获取JAXB 2.2.6 JAR?


更新:基于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出现在被认可的文件中,将被视为优先于任何其他加载的类(我相信)


有关更完整的示例,请参见上的正确答案:

只需将JAXB2.2实现(例如jaxb impl.2.2.5)添加到编译器的类路径中即可

<compilerarg value="-cp path_to_jaxb2_jar"/>

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

现在您也是我的朋友了!:)你的解决方案如承诺的那样有效。