jar 与.java文件的使用和编译器的奇怪行为



我很好奇.jar.class文件和.jar文件.java之间的差异。我在这里部分得到了答案,但是罐子里.java文件有什么用呢?

我的猜测是 jar 中的 java 文件就像一个防止编译错误的界面,因为我通过在使用 jar 时用 jar 文件.class替换 jar 文件来解决运行时抛出的IllegalAccessError,特别是当使用 jar 时,.javaXposed Framework。(从这个线程中得到了提示。

感谢您的解释,他们很有帮助。但是我想更多地了解编译器观点的差异,因为我想知道为什么我的应用程序运行良好,即使我只包含带有 java 文件的 jar,而不是类文件 (zxing)。此外,当我将jar与类文件一起包含时,在某些情况下会抛出IllegalAccessException,但是当我将jar与java文件(xposed)一起包含时不会抛出,即使我必须包含至少一个才能使编译器(AIDE)不抱怨引用,例如未知包。为什么当我只包含 jar 与 java 文件时,编译器不抱怨,尽管编译器无法解析引用类的实际实现?

.jar文件基本上只是一个带有另一个扩展名的.zip文件。

具有.class文件的.jar文件具有特殊用途,并且可能具有特殊的元数据(例如META-INF文件夹中)。

.jar文件.java文件只是一个.zip文件。

但是,开源库通常提供 3 个.jar文件:

  • 一个包含.class文件,供代码使用,用于编译和运行代码。

  • 一个包含.java文件,供 IDE 使用,因此您可以深入了解库代码并查看它。使用调试器单步执行代码时特别有用。

  • 一个包含 javadoc 文件(.html个文件),供 IDE 使用,因此您可以阅读有关库中类和方法的文档。您确实阅读了文档,对吗?

这 3 个文件都不必命名为.jar。它们可以重命名.zip,以便您可以在自己喜欢的 Zip 实用程序中轻松打开它们,或者它们可以重命名.foo只是因为......

它们应该被命名为.jar,以澄清它们是Java算法

它很简单 -*.java文件是源,*.class文件是编译类。

JVM在运行时使用什么?*.class文件。为什么要把源文件放在库中?IDK,通常源代码作为单独的 jar 分发,但总而言之,这样做是为了允许您在不反编译的情况下检查库代码。

最新更新