簡體   English   中英

為什么我們在java項目中使用rt.jar?

[英]Why do we use rt.jar in a java project?

rt.jar的必要性是什么?

它包含Java R un t ime環境中提供的所有類。

如果在類路徑中沒有它,則無法訪問需要使用的任何類,如java.lang.String或java.io.File。

rt =運行時間

它包含所有Java運行時庫。 (必要)

交叉編譯是一種必須明確使用它的情況。

例如,如果您使用的是Java 8,並希望在拒絕Java 8擴展時編譯Java 7。 所以你可以嘗試:

javac -source 1.7 Main.java

但是后來javac會說: warning: [options] bootstrap class path not set in conjunction with -source 1.7 ,因為它可能會針對不同版本的JCL生成錯誤co編譯。

所以你需要設置rt.jar

javac -source 1.7 -bootclasspath /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar Main.java

這被問到: 警告:[options] bootstrap類路徑未與-source 1.5一起設置

rt.jar代表運行時JAR並包含引導類,我的意思是來自Core Java API的所有類。 我發現很多Java程序員都不知道什么是rt.jar? 並經常混淆rt.jar文件的作用或為什么我們在Java中使用rt.jar文件? 毫不奇怪,這個名字有點神秘。

此文件始終位於JRE的lib目錄中,至少在Windows和Linux中。 在MacOSX中,它位於不同的位置,並且具有不同的名稱,即classes.jar,但這僅在JDK 1.7之前。 從Java 7版本開始,Apple已停止分發Java,如果單獨安裝,它將與rt.jar同名。

許多開發人員都認為將他們的類包含在rt.jar中以解決與類路徑相關的問題,但這是一個壞主意。 你永遠不應該弄亂rt.jar,它包含JVM信任的類文件,並且加載時沒有對其他類文件進行嚴格的安全檢查。

它包含Java內置類。 rt可能代表Runtime 沒有它你就無法運行Java程序:)

rt.jar是所有java包所在的位置。 例如,如果類文件調用java.util包,那么JVM可以在rt.jar中查找它,從而使其能夠正確運行。

旁注:不要亂用它。

運行時(rt.jar)包含構成Java SE的所有(大多數..)java類。 它會自動添加到類路徑中。

它包含所有標准JDK類。 在JVM中加載類的過程中,這是第一個加載的加載過程,由引導類加載器(所有類加載器的父加載器)完成。

您可以通過使用此選項編譯java程序來自行檢查:

javac -verbose program.java

為了看到加載的類的序列。

樣品:

[Loaded sun.security.timestamp.TimestampToken from /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar]
[Loaded sun.security.util.CertConstraintParameters from /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar]
[Loaded sun.security.util.ECKeySizeParameterSpec from /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar]
[Loaded sun.security.util.ECUtil from /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar]
[Loaded sun.security.util.Pem from /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar]

rt.jar代表運行時JAR並包含引導類,我的意思是來自Core Java API的所有類。 我發現很多Java程序員都不知道什么是rt.jar? 並經常混淆rt.jar文件的作用或為什么我們在Java中使用rt.jar文件? 毫不奇怪,這個名字有點神秘。 此文件始終位於JRE的lib目錄中,至少在Windows和Linux中。 在MacOSX中,它位於不同的位置,並且具有不同的名稱,即classes.jar,但這僅在JDK 1.7之前。 從Java 7版本開始,Apple已停止分發Java,如果單獨安裝,它將與rt.jar同名。 許多開發人員都認為將他們的類包含在rt.jar中以解決與類路徑相關的問題,但這是一個壞主意。 你永遠不應該弄亂rt.jar,它包含JVM信任的類文件,並且加載時沒有對其他類文件進行嚴格的安全檢查。 在本文中,我們將從Java世界中學習關於這個神奇的JAR的一些有趣的事情。 對於那些剛接觸Java並且不熟悉JAR文件的程序員來說,它是一個類似zip的文件,精確稱為Java archive,它存儲Java類文件和程序所需的任何資源。 它還可以包含mainfest文件,該文件可以包含Main-Class條目,使其成為可執行JAR,可以使用java -jar命令運行。

關於Java中rt.jar的重要觀點

  1. rt.jar代表運行時,包含核心Java Runtime環境的所有已編譯類文件。

2)您必須在類路徑中包含rt.jar,否則您無權訪問核心類,例如java.lang.String,java.lang.Thread,java.util.ArrayList或java.io.InputStream以及所有其他類來自Java API。 您可以通過使用WinRAR或WinZip客戶端打開它來實際查看rt.jar中的內容。 您可以看到它不僅包含所有Java API,還包含com包中指定的內部類。

什么是Java中的rt.jar

3)在windows中,rt.jar將始終位於$ JAVA_HOME / jre / lib下,其中$ JAVA_HOME指的是JDK安裝目錄。 即使您沒有安裝JDK並且只安裝JRE,您也會在完全相同的位置看到它,在$ JAVA_HOME / lib目錄中找不到rt.jar。 BTW,在MacOSX上,它被稱為classes.jar,位於/ System / Library / Frameworks // Classes目錄下。 在下面的屏幕截圖中,您可以看到rt.jar位於Windows 8中JRE的lib目錄中。

哪里可以在Windows,Linux和MacOSX中找到rt.jar

4)rt.jar是所有Java包所在的位置。 例如,如果類文件需要從java.util.concurrent包中引用類,例如ConcurrentHashMap,那么JVM將在rt.jar中查找它,從而使其能夠正確運行。

5)Java程序員問的另一個問題是,在哪里可以找到rt.jar中包含的類的源代碼? 好吧,如果您已經安裝了JDK而不是JRE,那么您可以在$ JAVA_HOME / src.zip文件中找到所有源代碼。 BTW,sun。*源也包含在src.zip中,但這是專有的閉源Oracle代碼。 我還建議你在Eclipse中包含這個JAR文件,這樣你只需鍵入Ctrl + T和類的名稱就可以查看任何JDK類的源代碼,其余部分將由Eclipse的Java類型搜索功能處理。

6)關於rt.jar最重要的一點是,JVM知道這個JAR文件中的所有類,這意味着JVM在從任何其他位置加載任何其他JAR時不會執行所有檢查。 這是由於各種性能原因而完成的,這就是為什么這些類由bootstrap或primodial類加載器加載的原因。 不要嘗試將您的類文件包含在rt.jar中,因為Java不建議這樣做。 它還與任何安全性妥協。

7)如果您對Java平台使用的不同二進制文件和JAR文件感到好奇,請查看此圖。 您可以看到JDK有三個主文件夾bin,lib和jre。 bin目錄包含所有二進制可執行文件,例如java.exe運行Java程序,javac.exe編譯Java程序等.lib包含tools.jar和dt.jar。 jre文件夾再次包含bin和lib目錄。 它位於這個lib目錄rt.jar駐留中。 順便說一下,為了完整解釋每個文件和文件夾的功能,請查看Oracle官方頁面。 它們非常全面和具有描述性。

JDK JRE中的基本文件夾和文件

這都是關於Java中的rt.jar文件。 現在你知道rt.jar的目的是什么,為什么你不應該惹它。 您可以在$ JAVA_HOME / jre / lib目錄中找到此JAR文件,我建議您自己查看。

閱讀更多: https//javarevisited.blogspot.com/2015/01/what-is-rtjar-in-javajdkjre-why-its-important.html#ixzz5icL7sAMZ

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM