【问题标题】:Is it possible to replace the version of the JAXB implementation in Java JRE 1.6 SE?是否可以替换 Java JRE 1.6 SE 中的 JAXB 实现版本?
【发布时间】:2013-04-19 09:16:34
【问题描述】:

我有这个测试课

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

【问题讨论】:

  • 错误来自编译器,实际上来自不同(较新)版本的语言。所以更换罐子将没有效果。只是好奇,你为什么不使用 Java 6?
  • 我不明白。 “......来自不同(较新)版本的语言......”,什么? “只是好奇,你为什么不使用 Java 6?”我是,也许应该是 Java 7,这是因为我们无法从 6 迁移到 7,而实际生产中的 Java 6...
  • @Betlista - 类似的问题和解决方案在stackoverflow.com/questions/8211420/…
  • @AndyThomas-Cramer 这正是我要找的...

标签: java jaxb


【解决方案1】:

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

@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 版本具有 1.19 修订版的 XmlElement,只有 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查看源代码

【讨论】:

  • 正如我所写的“...这对 Java 6 有效...”、“...我尝试将更新的 JAXB 库添加到类路径...”,其中目标是 @Target({FIELD, METHOD, PARAMETER}) .
  • @harsh - 在 Java 6 中,它被声明为 @Target(value={FIELD,METHOD,PARAMETER})。见docs.oracle.com/javaee/6/api/javax/xml/bind/annotation/…
  • 这就是为什么我要问如果可能的话,如何将jaxb-api-2.2.4.jar 中的类与Java 6 一起使用。
  • 好的,所以当我查看rt.jar 版本java version "1.6.0_18" 的来源时,它只显示FIELD 和METHOD。编辑了我的答案以包含有关 XMLElement 的版本信息。能看下jaxb-api-2.2.4.jar的源码吗?您的错误反映了它从 rt.jar 中选择 XMLElement 而不是您想要的。
【解决方案2】:

使用“认可库”文件夹的概念。看看这里: 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

【讨论】:

  • 我认为 Ravi 的答案比我的写得更好 - 请宁愿投票给@Ravi - 我做到了!
【解决方案3】:

使用 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/

【讨论】:

  • 我喜欢java.endorsed.dirs参数,因为我不需要修改所有应用程序的java安装...
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2021-07-15
相关资源
最近更新 更多