有没有一种方法可以修补jar文件?

17

假设我向某人发送了一个大的jar或war文件。我可以稍后只更改其中一个小节并将其发送给他吗? 假设我只更改了一个类文件。 我重新编译了Java以生成类文件。 除了用新类文件替换旧类文件外,还需要做其他事情吗?

在Java中,您是否必须重建整个jar / war文件?此外,是否有可用于更新的开源软件包?


已经在这里回答过了。 - Oliver
我真的有点震惊,之前没有人需要处理这个问题吗?难道每个人都要重新构建整个项目吗? - GC_
7个回答

9

2
+1,这通常可以工作,但要注意不要以这种方式修改已签名的JAR文件。 - casablanca
当你说简单的zip文件时,我有一些疑问。据我所知,jar文件也有清单。 - GC_
@Grae - 当然可以,但这怎么改变压缩方式与zip相同的事实呢?无论如何,这个信息对于问题来说可能是不相关的,所以我打算将其删除。 - Jeremy
jar umf foo.jar foo.class - 我在链接上找到了这个。我认为这是最好的选择。 - GC_
请注意,答案中的链接已经失效。这似乎是同一篇文章:http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/jar.html - Jeremy S

2
您可以通过以下方式复制修改后的 .class 文件。
jar uf test.jar com\test\Test.class

如果有逻辑方法可以将您的组件分开到单独的jar文件中,那么我建议每种组件类型创建一个jar文件。这样,您就不必将所有内容重新分发给客户端。例如,请看看Spring 3是如何将组件分离的。


即使我每次只需要更改一个jar文件,这在我的情况下仍然无济于事,因为所有的jar文件都在一个war文件中。 - GC_

2

有 JARDiff,旨在更新 Java WebStart 应用程序。


0

如果你不想让它们解压、覆盖文件并重新打包,那么你需要重新构建整个Jar文件。


是的,jar文件只是zip文件,但是有一个jar实用程序可供使用。它是标准JDK的一部分。 - Bryan Kyle
我的意思是,除了解压缩/压缩之外,unjar/jar是否有任何特殊功能? - GC_
我相信如果你还没有清单,它会为你创建一个。 - Bryan Kyle

0

看一下jar命令的用法。选项u允许您更新现有的存档。


0

只需使用7zip打开您的jar文件并覆盖您编辑过的类即可。不过请务必先进行备份。


@Grae:这取决于清单文件中包含了什么。通常它不包含与jar的下一个版本有所不同的内容。如果它包含签名信息,你也必须更改它。只需像通常一样创建一个带有旧类和新类的jar文件,并比较清单文件以查看是否会对你产生影响。 - Paŭlo Ebermann

0

如果你有旧的和新的JAR文件,你可以创建一个xdelta,然后只发送增量文件给客户端,这个文件通常比整个JAR文件要小得多,尤其是当你只修改了其中的一部分类。对于签名的 JAR 文件,这也可以很好地工作,但需要发送方和接收方都安装 xdelta 程序(或者能够安装它)。

当然,首先你必须创建新的JAR文件(但这可以通过其他答案中提到的方法完成)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接