jar文件到底包含什么?


88

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

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

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

感谢所有的答案!

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




5
@Blue Moon:有趣的是google将我引到了这里。:p
user1036719

@ user1036719虽然在这里找到答案很好,但是之前还有一个其他链接。而这实际上并不是我们需要鼓励的编程问题。我没有投票或关闭投票。
PP

Answers:


88

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

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


53

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

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

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


谢谢,我知道它有点像存档,因为我可以解压缩它,但是我很困惑为什么.class文件都不包含可读文本。感谢您的解释,我猜.class有点像.o文件。
joshualan 2012年


13

一个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
加1,因为你链接的标准
西罗桑蒂利郝海东冠状病六四事件法轮功

10

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


5

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


3

Jar(Java存档)包含一组.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

2

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

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

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



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类文件和资源的混合体此外,该规范还定义了JAR归档文件中元数据的标准位置-META-INF文件夹-以及其中的几种标准文件名和格式,其中最重要的是MANIFEST.MF文件。”


1

只需检查aopalliance.jar文件中是否包含.java文件而不是.class文件。如果是这样,只需解压缩jar文件,将其导入eclipse并通过eclipse创建一个jar。它为我工作。


1

在学习JAR时,我遇到了这个问题,但是对于像.NET这样的人来说,我无法获得足够的信息,因此,我要补充几点,以帮助像.NET背景这样的人。

首先,我们需要在.NET中定义与JAR类似的概念,这是程序集和程序集与Java JAR文件有很多共同点。

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

Java JAR文件在Java中执行类似的任务,但在实现上有很大的不同。程序集通常存储为EXE或DLL,而JAR文件则以ZIP文件格式存储。

信息来源-> 5个装配体

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.