繁体   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