【问题标题】:What exactly does a jar file contain?jar 文件究竟包含什么?
【发布时间】:2012-08-18 05:41:21
【问题描述】:

作为实习生,我在我的项目中使用公司代码,他们通常会向我发送一个 jar 文件供我使用。我将它添加到 Eclipse 中的构建 path 中,通常一切都很好。

但是,我很想知道每个类包含什么,当我尝试打开 jar 文件中的一个类时,它告诉我需要一个源文件。

这是什么意思?我来自 C/C++ 背景,所以 jar 类似于已经编译的 .o 文件,而我只能看到 .h 的东西?或者我正在使用的 jar 文件中是否有实际代码已加密,因此我无法读取?

感谢大家的回答!

编辑:
谢谢,伙计们,我知道这有点像档案,但我很困惑为什么当我试图打开 .class 文件时,我得到了一堆的随机字符。当我尝试在 C 中打开 .o 文件时,输出类似,所以我只是想确定一下。
谢谢!

【问题讨论】:

  • @Blue Moon:有趣的是谷歌把我带到了这里。 :p
  • @user1036719 虽然很高兴您在这里找到了答案,但之前还有另一个链接。这并不是一个真正需要在 SO 上鼓励的编程问题。不过,我没有投反对票或关闭投票。

标签: java jar


【解决方案1】:

JAR 文件实际上只是一个 ZIP 文件。它可以包含任何东西 - 通常它包含已编译的 Java 代码 (*.class),但有时也包含 Java 源代码 (*.java)。

但是,Java 可以被反编译 - 如果开发人员混淆了他的代码,您将不会得到任何有用的类/函数/变量名称。

【讨论】:

    【解决方案2】:

    但是,我很好奇每个类包含什么,当我尝试打开 jar 文件中的一个类时,它告诉我需要一个源文件。

    jar 文件基本上是一个 zip 文件,其中包含 .class 文件和可能的其他资源(以及有关 jar 本身的元数据)。很难将 C 与 Java 进行比较,因为 Java 字节码比大多数二进制格式维护更多的元数据 - 但类文件编译代码而不是源代码。

    如果您使用 zip 实用程序打开 jar 文件或运行jar xf foo.jar,您可以从中提取文件并查看它们。请注意,您不需要 jar 文件来运行 Java 代码 - 类加载器可以直接从文件系统、URL 以及 jar 文件加载类数据。

    【讨论】:

    • 谢谢,我知道它有点像存档,因为我可以解压缩它,但我很困惑为什么没有一个 .class 文件包含可读文本。感谢您的解释,我猜 .class 有点像 .o 文件。
    【解决方案3】:

    了解 jar 文件包含的内容的最佳方法是执行以下命令:

    转到命令行并执行jar tvf jarfilename.jar

    【讨论】:

      【解决方案4】:

      jar 文件是一个 zip 文件,其中包含一些包含元数据的附加文件。 (尽管有 .jar 扩展名,但它是 zip 格式,任何处理 .zip 文件的实用程序也可以处理 .jar 文件。)

      http://docs.oracle.com/javase/8/docs/technotes/guides/jar/index.html

      Jar 文件可以包含任何类型的文件,但它们通常包含类文件和支持配置文件(属性)、图形和应用程序所需的其他数据文件。

      类文件包含已编译的 Java 代码,可由 Java 虚拟机执行。

      http://en.wikipedia.org/wiki/Java_class_file

      【讨论】:

      • 加 1 因为你链接到标准
      【解决方案5】:

      JAR 代表 Java 归档。它是一种基于流行的 ZIP 文件格式的文件格式,用于将多个文件聚合为一个文件。虽然 JAR 可以用作通用归档工具,但其开发的主要动机是 Java 小程序及其必需组件(.class 文件、图像和声音)可以在单个 HTTP 事务中下载到浏览器,而不是打开每件作品都有一个新的连接。这极大地提高了小程序加载到网页上并开始运行的速度。 JAR 格式还支持压缩,这可以减小文件的大小并进一步缩短下载时间。此外,JAR 文件中的各个条目可能由小程序作者进行数字签名以验证其来源。

      【讨论】:

        【解决方案6】:

        Jar 文件包含以*.class 形式编译的Java 二进制类,通过使用一些开源反编译器对其进行反编译,可以将其转换为可读的.java 类。 jar 也有一个可选的META-INF/MANIFEST.MF,它告诉我们如何使用 jar 文件 - 指定其他 jar 文件与 jar 一起加载。

        【讨论】:

          【解决方案7】:

          Jar(Java Archive) 包含一组 .class 文件。

          1.创建Jar文件(Zip文件)

           if one .class (say, Demo.class) then use command jar -cvf NameOfJarFile.jar Demo.class (usually it’s not feasible for only one .class file)
          
           if more than one .class (say, Demo.class , DemoOne.class) then use command jar -cvf NameOfJarFile.jar Demo.class DemoOne.class
          
           if all .class is to be group (say, Demo.class , DemoOne.class etc) then use command jar -cvf NameOfJarFile.jar *.class
          

          2.提取Jar文件(解压文件)

              jar -xvf NameOfJarFile.jar
          

          3.显示目录

              jar -tvf NameOfJarFile.jar
          

          【讨论】:

            【解决方案8】:

            .jar 文件类似于 .exe 文件。 本质上,它们都是可执行的 zip 文件(不同的 zip 算法)。

            在 jar 文件中,您将看到文件夹和类文件。每个类文件都类似于您的 .o 文件,并且是一个已编译的 java 存档。

            如果您想查看 jar 文件中的代码,请下载 java 反编译器(位于此处:http://java.decompiler.free.fr/?q=jdgui)和 .jar 提取器(7zip 可以正常工作)。

            【讨论】:

              【解决方案9】:

              JD-GUI 是一个非常方便的 JAR 浏览和反编译工具

              【讨论】:

              • 这没有回答问题。
              【解决方案10】:

              .jar 文件包含已编译的代码(*.class 文件)和与该代码相关的其他数据/资源。它使您能够将多个文件捆绑到一个存档文件中。它还包含元数据。由于它是一个 zip 文件,它能够压缩您放入其中的数据。

              我发现一些有用的东西。

              http://www.skylit.com/javamethods/faqs/createjar.html

              http://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html

              OSGi 在实践中将 JAR 文件定义为,“JAR 是基于 ZIP 文件格式的存档文件, 允许将许多文件聚合到一个文件中。通常是文件 存档中包含已编译的 Java 类文件和资源的混合体 图像和文档等文件。此外,该规范定义了一个 元数据的 JAR 存档中的标准位置 - META-INF 文件夹 - 以及其中的几个标准文件名和格式,大多数 其中重要的是 MANIFEST.MF 文件。”

              【讨论】:

                【解决方案11】:

                只需检查aopalliance.jar 文件是否有.java 文件而不是.class 文件。如果是这样,只需提取 jar 文件,将其导入 eclipse 并通过 eclipse 创建一个 jar。它对我有用。

                【讨论】:

                  【解决方案12】:

                  在学习 JAR 时,我遇到了这个帖子,但无法为像我这样具有 .NET 背景的人提供足够的信息,所以我将添加几点可以帮助像我这样的人.NET 背景。

                  首先,我们需要在 .NET 中定义与 JAR 类似的概念,即 Assembly 并且程序集与 Java JAR 文件有很多共同之处。

                  因此,程序集是 .NET 环境中代码打包的基本单元。程序集是自包含的,通常包含来自编译类的中间代码、关于类的元数据以及打包代码执行其任务所需的任何其他文件。由于程序集是代码打包的基本单元,因此与类型交互相关的一些操作必须在程序集级别完成。 例如,授予安全权限、代码部署和版本控制都是在程序集级别完成的。

                  Java JAR 文件在 Java 中执行类似的任务,但最大的区别在于实现。程序集通常存储为 EXE 或 DLL,而 JAR 文件存储为 ZIP 文件格式。

                  Source of Information -> 5- Assemblies

                  【讨论】:

                    猜你喜欢
                    • 2014-08-20
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-01-01
                    • 1970-01-01
                    • 2016-07-17
                    • 2015-03-04
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多