不要使用com.sun.xml.internal。*?

时间:2010-05-19 05:20:54

标签: ant javac

这句话是否成立:

  

com.sun.xml.internal包是一个内部包,顾名思义。   用户不应编写依赖于内部JDK实现类的代码。这些类是JDK的内部实现细节,如有更改,恕不另行通知

我的一位同事使用了他的代码中的一个类,导致Ant中的javac任务无法编译我们的项目,因为编译器无法找到该类。来自Sun / Oracle的回答说这是编译器的预期行为,因为用户不应该使用该包。

问题是为什么包中的课程首先公开?

谢谢,

莎拉

3 个答案:

答案 0 :(得分:7)

JDK中的Sun类是前缀sun。*并且不是公共支持的接口的一部分,因此应谨慎使用。来自Sun FAQ

  

Sun包含的类   Java 2 SDK,标准版,秋季   进入包组java。,javax。,   org。*和sun ..除了太阳外。   包是标准的一部分   Java平台将得到支持   走向未来。一般来说,包   比如太阳,在外面   Java平台,可以跨越不同   操作系统平台(Solaris,Windows,Linux,   Macintosh等,并且可以随时更改   SDK版本时没有通知的时间   (1.2,1.2.1,1.2.3等)。程式   包含对太阳的直接调用。   包不是100%纯Java。在   换句话说:

     

java。,javax。和org。*包   记录在Java 2平台中   标准版API规范   弥补官方,支持,   公共接口。

     

如果Java程序只直接调用   这些包中的API,它将运行   在所有兼容Java的平台上   无论底层操作系统如何   平台。

     

太阳。*包不属于   支持,公共接口。

     

直接调用的Java程序   太阳。*包裹不保证   适用于所有Java兼容的   平台。实际上,这样的程序是   即使将来也不能保证工作   同一平台上的版本。

答案 1 :(得分:2)

这是因为Java可见性修饰符(特别是在类型级别,只有两个选项)目前没有粒度来实现您所暗示的那种可见性。我不知道你正在使用的内部类或类的细节,但基本上使这些类私有会使它们不适合它们的预期目的,所以唯一的另一种选择是公开的。

答案 2 :(得分:1)

可悲的是,JAXB(与Java6捆绑在一起)似乎依赖非公共类“com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper”来允许您在编组到xml时指定名称空间前缀。

你必须真正用你的方式来使用ant进行编译: http://pragmaticintegration.blogspot.com/

要点:

选项1。 将jre libs添加为bootclasspathref 添加属性:includeJavaRuntime =“yes”

选项2。 使用JAXB-RI库 - 将属性更改为“com.sun.xml.bind.marshaller.NamespacePrefixMapper”

此处还提到: Define Spring JAXB namespaces without using NamespacePrefixMapper