2012-02-29 81 views
6

當我去JavaDocs時,我在java包中找到了一些類,而其中一些包含在javax中。然後我碰到了javax vs java package關於javax和java包的一些基本問題

我從這個鏈接 差不多從所有的答案是javax包只是java庫的擴展。我的意思是第一個Java必須與核心Java庫I.E. java包但是當一些更多的包開發時,他們發佈了javax。對?

有些問題立即作爲開發人員進入我的腦海。 Java開發人員對不同命名的軟件包有什麼影響?以下是問題和分析: -

  1. 即使我同意javax只是核心java的擴展。但後來我再次看到完全不同的軟件包,如org.omg.CORBA等。爲什麼這個軟件名爲javax.omg.CORBA
  2. javax,org這樣的軟件包是否帶有標準的JDK和JRE下載?這些需要從JSE 1.6中單獨下載嗎?
  3. 引導類加載器是否嘗試在默認情況下查找這些包中的類,如同核心Java類(例如java.lang)一樣。
+0

我不明白第一個問題......你能詳細介紹一下/改寫它嗎? – m0skit0 2012-02-29 16:37:23

+1

可能重複[javax vs java包](http://stackoverflow.com/questions/727844/javax-vs-java-package) – 2012-02-29 16:49:53

回答

4

我認爲這是相當隨意的。正如Jon Skeet在回答你所提到的問題時所說的,其中大部分都是歷史性的。一個很好的例子就是javax.sql - 它包含了JDBC的類,這些類最初是J2EE的一部分,但是它們被引入了1.4中的J2SE。所以現在在java.sql和javax.sql之間有一些毫無意義的分離。在JDK內部的java/javax split沒有特別的含義。

  1. CORBA類是它們的位置,因爲它們不是由Java標準定義的;它們是CORBA規範中定義的接口的翻譯。
  2. 標準J2SE JDK/JRE(javax.sql,javax.xml)附帶有大量的javax。*包。還有一些javax。*包(javax.inject,javax.servlet等)。但是沒有包含在JDK中的java。*包。
  3. 我相信bootstrap類加載器會加載java。*和javax。*類。
+0

謝謝湯姆美麗的說明。你告訴corba類的兩個更多的澄清不是由java standar定義的,但是他們可以在jre6/jdk.1.6 lik類org.omg.CORBA.AnyHolder下看到這些類。另一個問題,我想問爲什麼javax.servlet,它被廣泛使用時不包含在覈心java kib中。這是因爲他們是特定的servlet容器像tomcat和不同的meainig他們?這就是爲什麼我可以看到這些庫inder容器/ lib文件夾,但不是作爲jre6/jdk1.6的一部分? – 2012-02-29 17:24:41

+0

JDK中包含了CORBA類,就像java.lang.String一樣基本的東西,即使Sun沒有定義它們。他們認爲他們非常有用,每個人都應該擁有他們(或者至少他們在1998年回來了)。 org.w3c.dom和org.xml.sax類也是如此。 – 2012-02-29 18:22:04

+1

JDK中不包含servlet類,因爲如果沒有servlet容器(如Tomcat或Jetty),就無法使用它們。例如,在桌面應用程序或小程序中使用它們是不可能的。所以,他們不在基本的JDK中。 – 2012-02-29 18:27:11

1
  1. 它們通常來自非Sun/Oracle的各方。例如。 org.omg包是由()的人創建的(顯然)您是否看到包名和域名之間的聯繫?
  2. 不,如果它們在特定版本的J2SE JavaDocs中列出,它們將與該版本一起標準化。以下是可用的軟件包(默認包含)J2SE版本6 & 7
  3. 是的,它們自動在類路徑上。嘗試導入其中一個類並編譯/運行它以確認。 OTOH注意它們類似於AWT類(Color,Font等),它們可以在其中導入,而不是java.lang包,其類別爲不是需要在代碼中有導入語句。

java.lang中並不需要進口..是不是因爲郎類更頻繁地使用?

基本上,是的。請注意,它只與編譯器有關。類文件包含完全限定的類名稱AFAIU。

+0

還有一個問題你有什麼想法爲什麼不需要導入java.lang其他需要在jre6。是否因爲lang類更頻繁使用? – 2012-02-29 17:26:15

+0

看到編輯... – 2012-02-29 17:58:45

2

從歷史上看,java. *包是JDK提供的包,而javax。*包將是必須單獨下載的包。它在某種程度上仍然以這種方式工作;所有java。*包都隨JDK提供,並且有許多javax。*包,如servlet,必須單獨下載。

當Sun決定將一些javax. *包(如Swing)移動到主JDK中時,就會將猴子扳手放入此計劃中。他們實際上會將包名從javax.swing更改爲java.swing,但是當它明確表示這會破壞大量代碼的向後兼容性時,他們決定改爲將包移入,但保留javax。揮杆名稱。所以這個名字不再是指示性的,但是出於歷史原因。

如果org.omg和org.w3c包發生了同樣的事情(它們是第三方庫,它們被移入核心JDK並且名稱無法更改),這並不會讓我感到驚訝。無論如何,如果它位於JDK API文檔中,則可以在不使用主JDK的情況下下載任何內容的情況下使用它,並且類加載器會發現它很好。