就像javax
包含扩展一样,com.sun
包应该包含什么内容?
它包含标准Java(EE)API的Sun Oracle参考实现。其中,Mojarra(Oracle的JSF参考实现)和Glassfish(Oracle的Java EE参考实现)使用此软件包。最好不要直接在代码中使用这些类,因为这将使你的代码紧密耦合到实现。直接针对java(x)
API进行编码,让你能够更改实现而无需更改代码(例如,使用MyFaces代替Mojarra和JBoss AS代替Glassfish)。JDK自己的HttpServer
也位于com.sun.*
包中,请参见Simple HTTP server in Java using only Java SE API。
请注意,com.sun.*
包不应与sun.*
包混淆,后者是Oracle JRE后面的内部类,你绝对不应该在代码中导入/使用它们,因为这将使你的代码紧密耦合到JRE版本。完全不使用sun.*
包可以让你在所有其他JRE实现上运行你的代码(OpenJDK、GCJ等)。
sun.
包的API - 当它们依赖于不受支持的包时,它们是如何得到支持的? - Lealocom.sum.*
包:“JDK 中的大多数 com.sun.* 包都是供内部使用的”。然而,该文档也有一些明确的例外。 - Lii有许多地方使用com.sun
包(其中一些在其他答案中提到)。本答案仅特别介绍了JavaFX中使用com.sun
的情况。JavaFX是OpenJDK的一部分的UI库。
很多JavaFX实现都在com.sun
类中。当JavaFX开源时,JavaFX开发人员就com.sun
类在JavaFX中的使用发表了以下评论:
一如既往,非公共API(或者更确切地说,不支持的API,指的是任何不在javafx命名空间下的东西,比如
com.sun.*
)不能被视为版本之间的稳定接口。但对于那些想知道其工作原理的人来说,未受支持的包中有一些非常重要的内容;而对于那些真正想要在OpenJFX上进行编程的人来说,这将更加有趣。
com.sun
中提供,以及许多其他已记录的扩展,它们肯定可以从一个版本依赖到另一个版本。 - user207421com.sun
类。但对于这些库,相关的com.sun
API是该组件公开发布的javadoc的一部分。对于JavaFX和许多其他Java系统组件,情况并非如此,这些组件中的com.sun
API仅供内部使用,未在公开发布的javadoc中记录,并且不应由最终用户使用。 - jewelsea这些是供内部使用的包,你不应该直接访问它们。它们可以在任何 Java 版本中更改或删除。你可以在 OpenJDK 中找到所有 sun.* 和 com.sun.* 包的源代码。
com.sun
命名空间并不是为了 JDK 实现而设计的:http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html - Rafael Winterhaltercom.sun.*
,而是写了一个额外的部分来讨论使用sun.*
的情况,这是第一个提示。此外,Sun Microsystems将所有非JCL Java代码发布在com.sun
下:http://search.maven.org/#search|ga|1|com.sun,显然打算使用`com.sun`类是合法的。此外,一些JDK工具如doclets是围绕`com.sun`命名空间构建的。 - Rafael Winterhaltersun.*
包,因为它们包含了内部JVM实现。对于com.sun.*
命名空间不存在这样的警告。两个命名空间唯一共同之处就是单词* sun *。这反映在这个问题的被接受答案中。 - Rafael Winterhaltercom.sun
都包含了Sun/Oracle JDK或扩展的已记录部分,比如所有JNDI提供者、所有JavaMail提供者、HTTP服务器、Javadoc标记等。因此,它们肯定不能在JDK的发布版本之间随意更改或删除。 - user207421
com.sun.mail.smtp
和com.sun.net.httpserver
这样的东西,我想。http://www.google.ca/search?q=java+com.sun&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a - Ry-