95

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

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

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

感谢所有的答案!

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

4

12 回答 12

94

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

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

于 2012-08-22T18:31:14.283 回答
57

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

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

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

于 2012-08-22T18:31:33.077 回答
19

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

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

于 2012-08-22T18:30:53.860 回答
15

文件是一个jarzip 文件,其中包含一些包含元数据的附加文件。(尽管有 .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

于 2012-08-22T18:33:48.037 回答
12

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

于 2014-07-11T06:05:51.163 回答
5

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

于 2012-08-22T18:36:40.130 回答
3

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
于 2016-06-06T08:22:57.183 回答
2

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

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

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

于 2012-08-22T18:32:23.090 回答
1

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

于 2012-08-22T18:52:37.063 回答
1

.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 类文件和资源的混合“

于 2013-07-19T05:05:11.410 回答
1

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

于 2016-03-08T07:41:17.790 回答
1

在学习 JAR 时,我遇到了这个线程,但无法为像我这样具有 .NET 背景的人获得足够的信息,所以我将添加一些可以帮助像我这样具有 .NET 背景的人的要点。

首先,我们需要在 .NET 中定义与 JAR 类似的概念,即汇编和汇编与 Java JAR 文件有很多共同点。

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

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

信息来源 -> 5- 组件

于 2018-11-23T09:45:14.753 回答