这句话是否成立:
com.sun.xml.internal包是一个内部包,顾名思义。 用户不应编写依赖于内部JDK实现类的代码。这些类是JDK的内部实现细节,如有更改,恕不另行通知
我的一位同事使用了他的代码中的一个类,导致Ant中的javac任务无法编译我们的项目,因为编译器无法找到该类。来自Sun / Oracle的回答说这是编译器的预期行为,因为用户不应该使用该包。
问题是为什么包中的课程首先公开?
谢谢,
莎拉答案 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