javax与java包的区别

473

javax包背后的理念是什么?哪些内容属于Java,哪些属于javax?

我知道很多企业级的包都在javax中,但Swing、新的日期和时间API(JSR-310)以及其他J2SE包也在其中。


可选包是开放标准API的实现(例如JavaServlet、Java3D)。大多数可选包都根源于javax.*命名空间,但也可能有例外。 - Lucky
8个回答

282

最初 javax 是用于扩展的,有时会将某些东西从 javax 提升到 java。

一个问题是Netscape(以及可能是IE)限制了可以在java包中的类。

当Swing被设置为从 javax "毕业" 到 java 时,出现了一些小波动,因为人们意识到他们必须修改所有的导入。鉴于向后兼容性是Java的主要目标之一,他们改变了想法。

那时,至少对于社区而言(也许对Sun不是这样),javax 的整个意义都失去了。所以现在我们有一些应该在 java 中的东西放在了 javax 中...但除了选择包名称的人之外,我不知道是否有人能够逐个案例地弄清楚其基本原理。


15
当Swing从javax转移到java时,“毕业”时,人们意识到他们必须修改所有的导入语句,这种情况引起了一些小规模的争议。这些人在抱怨一些可以通过正则表达式来完成的事情,这些问题是因为他们使用了预生产质量的代码而造成的。 - Sled
11
是的。在Sun决定将其保留在javax包中之前,我曾在Visual Cafe中编写了一个工具来在javax和java之间进行转换。 - TofuBeer
6
摆动问题可以通过同时在两个命名空间中拥有swing并为javax的一个添加弃用警告来减轻。 - jgomo3
1
@jgomo3 这个问题在于,除非他们在Java中添加类型别名,否则使用java.swing和使用javax.swing的代码将无法互操作。 - Solomon Ucko
2
@SolomonUcko 你说得对。这是一个有趣的语言特性。Clojure已经实现了它。在Java中的一个解决方法是将javax.swing.X作为所有X的虚拟类,继承自java.swing.X - jgomo3
@jgomo3 这只解决了一个方向的问题-使用java.swing的应用程序无法使用使用javax.swing的库,而且对于最终类来说也是不可能的。 - gbear605

239

我认为这是一个历史问题 - 如果一个包作为现有JRE的补充引入,它将以javax的形式出现。如果它首次作为JRE的一部分引入(例如我认为NIO是这样的),那么它将以java的形式出现。不确定为什么新的日期和时间API会按照这个逻辑最终以javax的形式出现...除非它也可以作为库单独使用以与早期版本兼容(这将很有用)。 多年后的注释:它(日期和时间API)最终确实成为java了。

我相信java包存在限制 - 我认为类加载器被设置为只允许从rt.jar或类似的地方加载java.*内的类。(ClassLoader.preDefineClass确实进行了检查。)

编辑:虽然正式说明(或bfish建议的搜索结果没有在前几页中得到说明)无疑是关于“核心”和“扩展”的,但我仍然怀疑在许多情况下,任何特定包的决定背后都有历史原因。例如,java.beans真的对Java很“核心”吗?


7
因为对于读者来说,按下alt-t并键入内容比我使用iPad剪切和粘贴更容易?; )。不过你是对的,我是指http://download.oracle.com/javase/tutorial/ext/index.html。顺便说一句,我通常发现你的回答很有用,我只是惊讶这个被接受了。 - orbfish
1
在此评论线程中建议的链接中没有出现“javax”一词。 - pamphlet
新的日期和时间API最终将成为java.time - Michael Piefel

68

Java包是基础,而javax包则是扩展。

Swing 是一个扩展,因为最初的UI API是AWT。在版本1.1中随后推出了Swing


Swing不是1.1的一部分。有一个在1.1上作为库运行的Swing版本。 - Tom Hawtin - tackline
这里的关键是“库”,不是JDK的一部分。我版本错了吗?我的javadocs表明JButton自1.3以来就存在,所以也许是我的记忆出了问题。 - duffymo
1
那么为什么javax中的新日期和时间API不是"base"? - Pacerier
1
“新的日期和时间API(JSR-310)…” - Oracle/Sun的某位决策者认为最好将其放在javax中,因为它是核心库的较新扩展。如果您不同意,请与他们联系。 - duffymo
仅供参考:他们撤销了那个决定,JSR-310被归入了java.time:http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html - Mark Rotteveel
仅供参考:这个答案已经超过六年了。但并不改变我的观点。 - duffymo

40

javax 命名空间通常用于标准扩展,也就是目前被称为可选包的内容。标准扩展是非核心 API 的子集;而另一部分非核心 API 显然被称为非标准扩展,占据了像 com.sun.* 或 com.ibm.* 这样的命名空间。核心 API 占用 java. 命名空间。

并不是所有 Java API 中的内容都始于核心,这就是为什么扩展通常源自 JSR 请求的原因。它们最终会基于“明智的建议”被提升到核心。

这种命名法的兴趣,源于 Sun 公司的一个失误——扩展本可以被提升到核心,也就是从 javax.* 移动到 java.*,从而打破向后兼容的承诺。程序员们大声抗议,更好的方案得以实现。这就是为什么 Swing API 虽然是核心的一部分,但仍然保留在 javax.* 命名空间中。同时,这也是如何将扩展从扩展升级为核心包的方式——它们只需作为 JDK 和 JRE 的一部分提供下载即可。


4

java.*包是核心Java语言包,意味着使用Java语言的程序员必须使用它们才能充分利用Java语言。

javax.*包是可选包,提供了一种标准、可扩展的方式,使自定义API对Java平台上运行的所有应用程序都可用。


3

Javax曾经只用于扩展。然而后来Sun将其添加到Java库中,却忘记删除x。开发人员开始使用javax编写代码。然而在后来的时间里,Sun决定将其改为Java。开发人员不喜欢这个想法,因为他们的代码会被破坏...所以javax被保留了下来。


2

一些包,比如javax.swing,最初并没有包含在Java标准库中。Sun公司决定将它们作为官方包含到早期版本的Java中作为标准库或标准扩展。

按照惯例,所有标准扩展都以X开头,随着时间的推移,它们可以被提升为一流,就像对于javax.swing所发生的那样。


1

所有的javax包都是实验性的包。当Swing足够稳定并准备好移动到java包时,已经有了太多的代码,他们决定保持现状以遵守向后兼容的承诺。这在Sams编辑Laura Lemay和Rogers Candedhead编写的《21天学会Java》一书中有解释。


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