8

这种说法是否属实:

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

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

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

谢谢,

莎拉

4

3 回答 3

7

JDK 中的 Sun 类以 sun.* 为前缀,并且不是公共支持接口的一部分,因此应谨慎使用。来自太阳常见问题解答

Sun 在 Java 2 SDK 标准版中包含的类属于包组 java.、javax.、org.* 和 sun.. 除了 sun。包是 Java 平台的标准部分,将来会得到支持。通常,Java 平台之外的软件包(例如 sun.)在不同的操作系统平台(Solaris、Windows、Linux、Macintosh 等)之间可能会有所不同,并且可能随时更改 SDK 版本(1.2、1.2),恕不另行通知.1、1.2.3 等)。包含直接调用太阳的程序。包不是 100% 纯 Java。换句话说:

java., javax. Java 2 平台标准版 API 规范中记录的 org.* 包构成了官方的、受支持的公共接口。

如果 Java 程序直接调用这些包中的 API,它将在所有 Java 兼容平台上运行,而不管底层 OS 平台如何。

sun.* 包不是受支持的公共接口的一部分。

不保证直接调用 sun.* 包的 Java 程序可以在所有 Java 兼容平台上运行。事实上,即使在同一平台上的未来版本中,也不能保证这样的程序可以正常工作。

于 2010-05-19T05:27:07.683 回答
2

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

于 2010-05-19T05:25:58.283 回答
1

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

你必须竭尽全力才能用 ant 进行编译:http: //pragmaticintegration.blogspot.com/

概括:

选项 1. 添加 jre 库作为 bootclasspathref 添加属性:includeJavaRuntime="yes"

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

这里还提到: Define Spring JAXB namespaces without using NamespacePrefixMapper

于 2010-11-29T14:16:09.977 回答