javax 与 java 包
Posted
技术标签:
【中文标题】javax 与 java 包【英文标题】:javax vs java package 【发布时间】:2010-10-18 04:33:32 【问题描述】:javax 包背后的基本原理是什么?什么进入 java,什么进入 javax?
我知道很多企业级包都在 javax 中,但 Swing、新的日期和时间 api (JSR-310) 和其他 J2SE 包也是如此。
【问题讨论】:
JSR 310 在java.time
现在download.java.net/jdk8/docs/api/java/time/package-summary.html
可选包是开放的标准 API 的实现(可选包示例JavaServlet
、Java3D
)。大多数可选包都植根于javax.*
命名空间,但也可能有例外。
【参考方案1】:
最初javax
是用于扩展的,有时会从javax
升级到java。
一个问题是 Netscape(可能还有 IE)限制了 java 包中的类。
当 Swing 被设置为从 javax
“毕业”到 java
时,出现了一些小问题,因为人们意识到他们必须修改所有的导入。鉴于向后兼容性是 Java 的主要目标之一,他们改变了主意。
在那个时候,至少对于社区(也许不是对于 Sun)来说,javax
的全部意义都丢失了。所以现在我们在 javax 中有一些东西可能应该在 java
... 但除了选择包名的人之外,我不知道是否有人能逐个弄清楚理由是什么基础。
【讨论】:
“当 Swing 被设置为从 javax “毕业”到 java 时,出现了一些小问题,因为人们意识到他们必须修改所有的导入。”人们抱怨由于他们使用预生产质量代码而可以通过正则表达式完成的事情? 是的。在 Sun 决定将其保留在 javax 包中之前,我在 Visual Cafe 中编写了一个工具来在两者(javax 和 java)之间进行转换。 可以通过同时在两个命名空间中使用 swing 来缓解摇摆问题,并在 javax 中添加弃用警告。【参考方案2】:我认为这是一件历史性的事情——如果一个包作为现有 JRE 的补充被引入,它会以javax
的形式出现。如果它最初是作为 JRE 的 part 引入的(我相信就像 NIO 一样),那么它会以 java
的形式出现。不知道为什么新的日期和时间 API 最终会按照这个逻辑以javax
结尾......除非它也可以作为一个库单独提供以与早期版本一起使用(这将很有用)。 多年后的注意事项:它(日期和时间 API)实际上最终位于 java
中。
我相信java
包存在限制 - 我认为类加载器设置为仅 允许从rt.jar
或类似的东西加载java.*
中的类。 (ClassLoader.preDefineClass
肯定有人签到。)
编辑:虽然官方解释(搜索 orbfish 建议在第一页左右没有产生一个)毫无疑问是关于“核心”与“扩展”,但我仍然怀疑在许多情况下,任何特定的决定package 背后也有历史原因。例如,java.beans
真的是 Java 的“核心”吗?
【讨论】:
因为阅读器按 alt-t 并键入它比我使用 iPad 剪切和粘贴更容易? ;)。不过,您是对的,我认为我的意思是download.oracle.com/javase/tutorial/ext/index.html。顺便说一句,我通常觉得你的答案很有用,我只是很惊讶这个答案被接受了。 “javax”一词没有出现在此评论线程前面建议的链接中。 新的日期和时间 API 实际上最终会以java.time
结束。【参考方案3】:
java
包是基础,javax
包是扩展。
Swing 是一个扩展,因为 AWT 是最初的 UI API。 Swing 在 1.1 版本之后出现。
【讨论】:
Swing 不是 1.1 的一部分。有一个 Swing 版本作为库在 1.1 上运行。 关键是“库”,不是 JDK 的一部分。我是不是版本不对?我的 javadocs 表明 JButton 是从 1.3 开始的,所以也许我的记忆让我失望了。 那么为什么javax中的新日期和时间API..日期和时间不是“基础”? "...新的日期和时间 api (JSR-310)..." - Oracle/Sun 的某个人认为最好把它放在 javax 中,因为它是核心的更新扩展图书馆。如果您不同意,最好与他们讨论。 仅供参考:他们撤销了该决定,并将 JSR-310 置于java.time
:docs.oracle.com/javase/8/docs/api/java/time/…【参考方案4】:
javax 命名空间通常(这是一个加载的词)用于标准扩展,目前称为optional packages。标准扩展是非核心 API 的子集;非核心 API 的另一部分显然称为非标准扩展,占用了 com.sun.* 或 com.ibm. 等命名空间。核心 API 占用 java. 命名空间。
并非 Java API 世界中的所有内容都从核心开始,这就是为什么扩展通常源自 JSR 请求。他们最终会根据“明智的建议”晋升为核心。
对这个命名法的兴趣源于 Sun 的失礼——扩展本可以提升为核心,即从 javax.* 移动到 java.*,这违反了向后兼容的承诺。程序员声音嘶哑,更好的理智占了上风。这就是为什么 Swing API 虽然是核心的一部分,但仍然保留在 javax.* 命名空间中。这也是软件包从扩展提升到核心的方式——它们只是作为 JDK 和 JRE 的一部分提供下载。
【讨论】:
【参考方案5】:Javax 过去只用于扩展。然而后来 sun 将它添加到 java 库中忘记删除 x。开发人员开始使用 javax 编写代码。然而后来,suns 决定将其更改为 java。开发人员不喜欢这个想法,因为他们的代码会被破坏......所以保留了 javax。
【讨论】:
【参考方案6】:java.* 包是核心 Java 语言包,这意味着使用 Java 语言的程序员必须使用它们才能对 Java 语言进行任何有价值的使用。
javax.* 包是可选包,它提供了一种标准的、可扩展的方式,使自定义 API 可用于在 Java 平台上运行的所有应用程序。
【讨论】:
【参考方案7】:像javax.swing
这样的一些包最初没有包含在java标准库中。 Sun 公司决定将它们视为官方的,并将它们作为标准库或标准扩展包含在 Java 的早期版本中。
按照惯例,所有标准扩展都以X
开头,而随着时间的推移,它们可以像javax.swing
一样被提升为一流。
【讨论】:
【参考方案8】:所有 javax 包都旨在成为实验包。当 Swing 足够稳定并准备好转移到 java 包时,那里的代码太多了,他们决定将其保留原样,以保持他们对向后兼容性的承诺。这在由 Laura Lemay 和 Rogers Candedhead 撰写的 Sams 社论中的 21 天内学习 Java 一书中对此进行了解释。
【讨论】:
以上是关于javax 与 java 包的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 出现" java: 程序包javax.servlet不存在 java: 程序包javax.servlet.annotation"等错误
不能引入javax.servlet.http.*;和javax.servlet.*;包
带有 Java 9 和 ClassPath 的 javax.smartcardio