【问题标题】:Some basic questions about javax vs java packages关于 javax 与 java 包的一些基本问题
【发布时间】:2012-02-29 16:33:02
【问题描述】:

当我访问 JavaDocs 时,我在 java 包中找到了一些类,而在 javax 中找到了一些类。然后我遇到了javax vs java package

我从这个链接得到什么 几乎所有的答案都是 javax 包只是 java 库的扩展。我的意思是第一个 Java 必须带有核心 Java 库 I.E。 java 包,但是当开发了更多包时,它们与javax 一起发布。正确的?

作为开发人员,我立即想到了一些问题。这些不同名称的包对 Java 开发人员有什么影响。以下是问题和分析:-

  1. 即使我同意javax 只是核心java 的扩展。但话又说回来,我看到了完全不同的包,例如 org.omg.CORBA 等。为什么将其命名为 javax.omg.CORBA
  2. javaxorg 这样的软件包是否附带标准的JDK 和JRE 下载?这些是否需要与 JSE 1.6 分开下载?
  3. 默认情况下,引导类加载器是否会尝试在这些包中查找类,就像在核心 Java 类的情况下一样(如 java.lang)。

【问题讨论】:

标签: java packages


【解决方案1】:

我认为这是相当随意的。正如 Jon Skeet 在回答您所链接的问题时所说,其中大部分是历史性的。 javax.sql 就是一个很好的例子——它包含与 JDBC 相关的类,这些类最初是 J2EE 的一部分,但在 1.4 中被引入 J2SE。所以现在在 java.sql 和 javax.sql 之间有一个毫无意义的类分割。 JDK 内部的 java/javax 拆分没有特殊含义。

  1. CORBA 类位于它们所在的位置,因为它们不是由 Java 标准定义的;它们是 CORBA 规范中定义的接口的翻译。
  2. 标准 J2SE JDK/JRE(javax.sql、javax.xml)附带了很多 javax.* 包。还有一些 javax.* 包没有(javax.inject、javax.servlet 等)。但是没有 java.* 包不在 JDK 中。
  3. 我相信引导类加载器会加载 java.* 和 javax.* 类。

【讨论】:

  • 感谢汤姆的精彩说明。正如您告诉 corba 类不是由 java 标准定义的那样,还有两个澄清,但我可以在 jre6/jdk.1.6 下看到这些类,就像类 org.omg.CORBA.AnyHolder 一样。我想问的另一个问题为什么 javax.servlet 在广泛使用时不包含在核心 java kib 中。是因为它们是特定的 servlet 容器,如 tomcat 和不同的含义吗?这就是为什么我可以看到这些库 inder 容器/lib 文件夹而不是 jre6/jdk1.6 的一部分?
  • CORBA 类包含在 JDK 中,就像 java.lang.String 之类的基本内容一样,尽管 Sun 没有定义它们。他们认为它们非常有用,每个人都应该拥有它们(或者至少,他们早在 1998 年就拥有了)。 org.w3c.dom 和 org.xml.sax 类也是如此。
  • servlet 类不包含在 JDK 中,因为没有 servlet 容器(如 Tomcat 或 Jetty)就无法使用它们。例如,不可能在桌面应用程序或小程序中使用它们。所以,它们不在基本的 JDK 中。
  • 有一些包,比如 javax.inject,可以在任何地方使用,也可以在 JDK 中。但是,它们是相当新的,因此它们已单独定义。有可能有一天,他们会搬进 JDK。
【解决方案2】:

从历史上看,这个想法是 java.* 包将是 JDK 附带的包,而 javax.* 包将是必须单独下载的包。在某种程度上,它仍然以这种方式工作。所有的 java.* 包都是 JDK 自带的,还有很多 javax.* 包,比如 servlet,需要单独下载。

当 Sun 决定将一些 javax.* 包(如 Swing)移动到主 JDK 中时,这个计划被投入了一个活动扳手。他们实际上打算将包名称从 javax.swing 更改为 java.swing,但当很明显这会破坏大量代码的向后兼容性时,他们决定将包移入,但保留 javax.swing。摇摆名称。所以这个名字不再是指示性的,而是出于历史原因。

如果同样的事情发生在 org.omg 和 org.w3c 包(它们是第三方库,已移入核心 JDK 并且无法更改名称),我不会感到惊讶。无论如何,如果它在 JDK API 文档中,您可以使用它而无需下载除主 JDK 之外的任何东西,并且类加载器会发现它很好。

【讨论】:

    【解决方案3】:
    1. 他们通常来自非 Sun/Oracle 的各方。例如。 org.omg 包是由http://omg.org/ 的人创建的(显然)你看到包名和域名之间的联系了吗?
    2. 不,如果它们在特定版本的 J2SE JavaDocs 中列出,它们是该版本的标准配置。以下是适用于(默认包含)J2SE 版本67 的软件包。
    3. 是的,它们自动位于类路径中。尝试导入其中一个类并编译/运行它以确认这一点。 OTOH 请注意,它们就像 AWT 类(ColorFont 等),可以在其中导入它们,而不是 java.lang 包,其类 代码中需要有 import 语句。

    java.lang不需要导入..是不是因为lang类使用的比较频繁?

    基本上,是的。请注意,它仅与编译器相关。类文件包含完全限定的类名 AFAIU。

    【讨论】:

    • 还有一个问题你知道为什么java.lang不需要导入而其他需要在jre6中。是不是因为 lang 类的使用频率更高?
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2019-10-16
    相关资源
    最近更新 更多