com.sun包里面有什么?

20

就像javax包含扩展一样,com.sun包应该包含什么内容?


1
类似于com.sun.mail.smtpcom.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-
3个回答

35

它包含标准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等)。


Java中使用sun.包的API - 当它们依赖于不受支持的包时,它们是如何得到支持的? - Lealo
1
@Lealo 因为它们是由同一组人维护的。 - BalusC
这些人会确保他们从sun.package使用的任何内容都能正常工作吗?否则,他们会想出其他替代方案或使用其他包来替换它们,从而确保他们自己的“java.”包继续正常工作。我理解得对吗? - Lealo
1
@Lealo 这些不支持供外部开发人员使用。如果它们根本不被支持用于任何用途,那么它们存在的意义就不存在了。 - user207421
1
@BalusC JEP 403 表示以下内容,似乎与您的说法相矛盾,即通常可以在一般情况下使用 com.sum.* 包:“JDK 中的大多数 com.sun.* 包都是供内部使用的”。然而,该文档也有一些明确的例外。 - Lii
@Lii:*..在JDK中..*。 - BalusC

1

有许多地方使用com.sun包(其中一些在其他答案中提到)。本答案仅特别介绍了JavaFX中使用com.sun的情况。JavaFX是OpenJDK的一部分的UI库

很多JavaFX实现都在com.sun类中。当JavaFX开源时,JavaFX开发人员就com.sun类在JavaFX中的使用发表了以下评论:

一如既往,非公共API(或者更确切地说,不支持的API,指的是任何不在javafx命名空间下的东西,比如com.sun.*)不能被视为版本之间的稳定接口。但对于那些想知道其工作原理的人来说,未受支持的包中有一些非常重要的内容;而对于那些真正想要在OpenJFX上进行编程的人来说,这将更加有趣。


然而,这仅适用于JavaFX。所有JNDI和JavaMail提供程序也在com.sun中提供,以及许多其他已记录的扩展,它们肯定可以从一个版本依赖到另一个版本。 - user207421
是的,有一些Java组件(例如javamail)可以让最终用户使用com.sun类。但对于这些库,相关的com.sun API是该组件公开发布的javadoc的一部分。对于JavaFX和许多其他Java系统组件,情况并非如此,这些组件中的com.sun API仅供内部使用,未在公开发布的javadoc中记录,并且不应由最终用户使用。 - jewelsea

-1

这些是供内部使用的包,你不应该直接访问它们。它们可以在任何 Java 版本中更改或删除。你可以在 OpenJDK 中找到所有 sun.* 和 com.sun.* 包的源代码。


3
com.sun 命名空间并不是为了 JDK 实现而设计的:http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html - Rafael Winterhalter
@raphw 你能否添加一个支持你说法的链接。你提供的链接甚至没有提到 com.sun.*。 - Peter Lawrey
1
事实上,他们甚至没有提到com.sun.*,而是写了一个额外的部分来讨论使用sun.*的情况,这是第一个提示。此外,Sun Microsystems将所有非JCL Java代码发布在com.sun下:http://search.maven.org/#search|ga|1|com.sun,显然打算使用`com.sun`类是合法的。此外,一些JDK工具如doclets是围绕`com.sun`命名空间构建的。 - Rafael Winterhalter
“com.sun” 命名空间不是 JDK 实现的目标。正如您在第二条评论中提到的那样,“com.sun” 是 JavaDoc 文档和标签所指定的命名空间。 - aliteralmind
2
Oracle(以前是Sun)明确警告不要使用sun.*包,因为它们包含了内部JVM实现。对于com.sun.*命名空间不存在这样的警告。两个命名空间唯一共同之处就是单词* sun *。这反映在这个问题的被接受答案中。 - Rafael Winterhalter
很多com.sun都包含了Sun/Oracle JDK或扩展的已记录部分,比如所有JNDI提供者、所有JavaMail提供者、HTTP服务器、Javadoc标记等。因此,它们肯定不能在JDK的发布版本之间随意更改或删除。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接