【发布时间】:2019-05-27 16:44:13
【问题描述】:
rt.jar 的必要性是什么??
【问题讨论】:
标签: java
rt.jar 的必要性是什么??
【问题讨论】:
标签: java
它包含 Java Runtime 环境中提供的所有类。
如果您的类路径中没有它,您将无法访问您需要使用的任何类,例如 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 编译时产生错误。
因此您需要将rt.jar 设置为:
javac -source 1.7 -bootclasspath /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar Main.java
提问于:warning: [options] bootstrap class path not set in conjunction with -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 中查找它,从而使其能够正确运行。
附带说明:不要乱来。
【讨论】:
它包含所有标准的 JDK 类。在JVM的类加载过程中,这是第一个被加载的,由bootstrap类加载器完成,所有类加载器的父类。
你可以通过这个选项编译一个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]
【讨论】:
javac -verbose:class program.java 时,我得到javac: invalid flag: -verbose:class...应该是javac -verbose program.java 还是我错过了什么?谢谢。
运行时 (rt.jar) 包含构成 Java SE 的所有(大多数..)java 类。它会自动添加到类路径中。
【讨论】:
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 存档,其中存储了 Java 类文件和程序所需的任何资源。它还可以包含mainfest文件,可以包含Main-Class条目,使其成为可执行的JAR,可以使用java -jar命令运行。
关于 rt.jar 在 Java 中的要点
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。顺便说一句,在 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 文件中找到所有源代码。顺便说一句,src.zip 中也包含 sun.* 源代码,但这是专有的闭源 Oracle 代码。我还建议你在 Eclipse 中包含这个 JAR 文件,这样你就可以通过键入 Ctrl + T 和类名来查看任何 JDK 类的源代码,其余的将由 Eclipse 的 Java 类型搜索功能来处理。
6) 关于 rt.jar 最重要的一点是该 JAR 文件中的所有类对于 JVM 都是已知的,这意味着 JVM 在从任何其他地方。这是由于各种性能原因而完成的,这就是这些类由引导程序或原始类加载器加载的原因。不要尝试在 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 文件,我鼓励您自己查看。
【讨论】: