是否有可能在Java JRE 1.6 SE中替换JAXB实现的版本?

时间:2013-04-25 12:59:21

标签: java jaxb

我有这个测试类

import javax.xml.bind.annotation.XmlElement;

class CompileTest {

   void foo( @XmlElement String in ) {
   }

}

我的java版本是

$ java -version
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing)

当我尝试编译那个类时,我正在

javac CompileTest.java
CompileTest.java:5: annotation type not applicable to this kind of declaration
   void foo( @XmlElement String in ) {
             ^
1 error

这对Java 6有效。当我尝试将更新的JAXB库添加到类路径时,它没有帮助。有办法解决这个问题吗?

javac -cp jaxb-api-2.2.4.jar CompileTest.java

3 个答案:

答案 0 :(得分:11)

使用 Java认可的标准覆盖机制

jaxb-api-2.2.4.jar放在<java-home>\lib\endorsed目录中。

或者,使用-D java.endorsed.dirs 选项

javac -Djava.endorsed.dirs=/your/path/to/jaxb-directory CompileTest.java

参考文献:
http://docs.oracle.com/javase/6/docs/technotes/guides/standards/

答案 1 :(得分:4)

使用“endorsed libraries”文件夹的概念。看看这里: How can I make Ant use JAXB x instead of Java 6 SE JAXB classes ...

基本上这是一种指示JRE使用更新版本的JAXB的方法。

您可以在这里阅读更多内容: Unofficial guide to JAXB: Using JAXB 2 with SE 6 另见这个问题: What is the exact way to use endorsed directory in JRE 6

答案 2 :(得分:2)

它只能应用于字段或方法,而不能应用于方法参数。参见

@Retention(RUNTIME) @Target({FIELD, METHOD})
public @interface XmlElement {

编辑:XmlElement的来源(JDK 1.6.0_18)

 * @since JAXB2.0
 * @version $Revision: 1.19 $
 */

@Retention(RUNTIME) @Target({FIELD, METHOD})
public @interface XmlElement {

所以我看到的是1.6.0_18版本的XmlElement为1.19版本,只有FIELDMETHOD目标可用。

编辑:所以你的问题是jdk 1.6 XmlElement与jaxb.2.2不同。您可以在http://grepcode.com/file/repo1.maven.org/maven2/javax.xml.bind/jaxb-api/2.2.4/javax/xml/bind/annotation/XmlElement.java?av=f

查看来源