在计算机科学中,我了解到.jar文件基本上是一组已经编译过的压缩的.java文件。因此,当你有一个项目时,你可以拥有一堆压缩类(.jar),而不是那些20个.java文件。去年在CSI,我们使用了名为DanceStudio的.jar文件,我们不得不使用这个文件让脚走过地板。今年,我们正在使用不同的程序来更好地理解java,所以我解压缩了包含26个类的.jar文件,然后我反编译。我想尝试通过编译所有.java文件以及使程序运行所需的其他文件(Walker,Foot,ETC)来创建程序。当我尝试编译所有这些文件时,它会说我有重复文件(Walker,Foot,ETC。)我不明白为什么如果.jar文件基本上是相同的东西,只是以压缩形式编译。令我困惑的是.jar中的Foot,ETC文件实际上更复杂并且代码更多。
有人可以解释一下.jar文件是如何工作的,并将这些文件分开,以及如何使用不在.jar文件中的重复类运行它?
答案 0 :(得分:5)
首先,您在解释.jar文件时缺少一步。
.jar
文件是.class
个文件的集合。 .class
文件是通过编译.java
文件生成的。
通常单个.java
文件将生成单个.class
文件,因为它将包含单个类型定义。但是.java
文件有多种方法可以生成多个.class
文件(内部/嵌套类,匿名类,顶级非公共类......),所以它不是< em>必然 .java
个文件与.class
个文件之间的1对1关联。
然后令人困惑的是,反编译的Java源代码看起来比原始Java源代码更复杂。这个很容易回答:编译步骤设计是不可逆的。
当Java编译器将.java
个文件转换为.class
个文件时,它会生成最适合执行的格式。该格式不代表与Java源文件完全相同的概念。例如:Java字节码中没有经典的“if”。它将通过适当的跳转命令来实现。
所有这些意味着将.class
文件转换回.java
文件的过程很复杂,而且通常不完美。
答案 1 :(得分:0)
您通常将(明文).java源文件编译为(二进制).class文件。
如果您使用包,那么类文件将位于不同的子目录中(代表包)。
.jar文件是一个压缩的二进制文件,它将所有.classes放在一个紧凑,易于管理的文件中。
.jar文件还可以包含其他文件,例如清单,位图和资源。
.jar文件也可以“签名”以确保其内容的完整性/真实性。
以下是一些很好的链接:
http://en.wikipedia.org/wiki/JAR_%28file_format%29
http://download.oracle.com/javase/tutorial/deployment/jar/
'希望有所帮助
答案 2 :(得分:0)
关于你的副本:也许你的.jar仍然在你的构建路径中,所以当你尝试用反编译的类编译你的项目时,你会有重复。检查并删除.jar,如果它仍然在您的构建路径中。