【问题标题】:Why do we use rt.jar in a java project?为什么我们在 java 项目中使用 rt.jar?
【发布时间】:2019-05-27 16:44:13
【问题描述】:

rt.jar 的必要性是什么??

【问题讨论】:

    标签: java


    【解决方案1】:

    它包含 Java Runtime 环境中提供的所有类。

    如果您的类路径中没有它,您将无法访问您需要使用的任何类,例如 java.lang.String 或 java.io.File。

    【讨论】:

      【解决方案2】:

      rt = 运行时间

      它包含所有的 java 运行时库。 (必需)

      【讨论】:

        【解决方案3】:

        交叉编译是您必须明确使用它的一种情况。

        例如,如果您使用的是 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

        【讨论】:

          【解决方案4】:

          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 信任的类文件,并且在没有对其他类文件进行严格的安全检查的情况下加载。

          【讨论】:

            【解决方案5】:

            它包含 Java 内置类。 rt 可能代表Runtime。没有它,您将无法运行Java 程序:)

            【讨论】:

              【解决方案6】:

              rt.jar 是所有 java 包所在的位置。例如,如果一个类文件调用 java.util 包,那么 JVM 可以在 rt.jar 中查找它,从而使其能够正确运行。

              附带说明:不要乱来。

              【讨论】:

                【解决方案7】:

                它包含所有标准的 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 还是我错过了什么?谢谢。
                • @brntsllvn 我已经编辑了答案。它应该只是 java -verbose (docs.oracle.com/javase/7/docs/technotes/tools/windows/…)
                【解决方案8】:

                运行时 (rt.jar) 包含构成 Java SE 的所有(大多数..)java 类。它会自动添加到类路径中。

                【讨论】:

                  【解决方案9】:

                  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 中的要点

                  1. 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 文件,我鼓励您自己查看。

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-10-13
                    • 2020-11-02
                    • 2017-07-28
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-02-06
                    • 2011-08-13
                    • 2011-07-01
                    相关资源
                    最近更新 更多