修改jar中的文件


87

我想修改jar中的文件。是否可以在我的应用程序中执行此操作而无需提取和重新震撼?

我要修改的文件是配置文件,主要是基于xml的文件。

我感兴趣的原因是,如果我将其解压缩,则无法再次创建.exe文件。


1
我想在应用程序中保留补充文件,而不在文件系统上创建临时文件。
2009年

试试这个解决方案stackoverflow.com/a/4837522/1853864 我使用了,我的问题就解决了。
A.Magalhães12年

您能不能接受当前接受的答案?它的分数为负数,绝对没有帮助
Dici

Answers:


83

您可以使用该u选项jar

从Java教程中:

jar uf jar-file input-file(s)

“存档中已存在且与添加的文件具有相同路径名的任何文件都将被覆盖。”

请参阅更新JAR文件

比重新制作整个罐子要好得多。从程序中调用它也听起来是可能的。尝试在Java中运行命令行


太棒了!但是他们添加了有趣的路径名。IE Bitbucket.foo.bar而非现有的com.etc.etc
StarWind0 '16

26

您可以使用Vim:

vim my.jar

Vim可以编辑压缩的文本文件,只要您unzip在环境中即可。


3
这很棒。导航到您要查找的文件,然后按Enter。编辑文件,然后输入:wq保存!
Michael Butler

另外,您还需要zip在环境中保存更改。谢谢你的回答!
troig

11

Java jar文件与zip文件具有相同的格式-因此,如果您有一个zip文件实用程序可让您修改档案,那么您就可以介入了。第二个问题是,如果您想重新编译类或其他内容,则可能仅需重新构建jar。但是文本文件或其他内容(例如xml)应该易于修改。


8

就像很多人说的那样,您不能在不更改JAR的情况下更改JAR中的文件。使用Launch4J更糟,一旦更改JAR,就必须重新生成EXE。所以不要走这条路。

将配置文件放入JAR通常是个坏主意。这是我的建议。在某些预定位置(例如主目录,\ Program Files \等)中搜索您的配置文件。如果找到配置文件,请使用它。否则,请使用JAR中的一个作为备用。如果这样做,您只需要在预定位置写入配置文件,程序就会将其提取。

这种方法的另一个好处是,如果您升级软件,则修改后的配置文件不会被覆盖。



2

这可能比您短期内要处理的工作要多,但是从长远来看,我怀疑这对于您使用Ant(或Maven甚至Bazel)而不是手动构建jar会非常有益。。这样,您只需单击ant文件(如果使用Eclipse)并重建jar。

另外,您可能实际上根本不想在jar中包含这些配置文件-如果您期望定期替换这些文件,或者如果应该将其分发给多个参与者,则该配置文件不应属于所有的罐子。


2
同意 但是,您可能需要在JAR中放入一个“默认”配置文件,因此,如果外部配置文件发生损坏(损坏,删除等),则可以使用默认配置。
Thomas Owens

没错-尽管我不知道有多少个应用程序会在没有其配置文件的情况下继续运行...
dimo414

1

为了扩展dfa所说的内容,原因是因为jar文件的设置类似于zip文件。如果要修改文件,则必须读出所有条目,修改要更改的条目,然后将条目写回到jar文件中。我以前必须这样做,而这是我找到的唯一方法。

编辑

请注意,这使用的是Java jar文件编辑器的内部功能,即文件流。我敢肯定有一种方法可以做到,您可以将整个jar读取到内存中,修改所有内容,然后写回文件流。我相信这就是7-Zip等实用程序正在做的事情,因为我认为zip标头的ToC必须在写入时定义。但是,我可能是错的。


1

是的,您可以,使用SQLite可以从jar文件中读取或写入数据库,这样您就不必提取然后重新打包它,请按照我的文章http://shoaibinamdar.in/blog/进行操作? p = 313

使用语法“ jdbc:sqlite :: resource:”,您将能够从jar文件中读取和写入数据库


1
嗨,欢迎来到stackoverflow。我已经从您的帖子中删除了缩写。通常,此处不适合使用短信样式简写。我认为,如果您在自己的答案中包含博客中的更多详细信息,那么这个答案将是一个很好的答案,以便即使您未阅读博客或被感动的人,阅读您答案的人也会学到一些东西到将来某个日期的另一个URL。
Flexo

1

查看TrueZip

它通过虚拟文件系统API完全满足您的需要(在jar文件中内联编辑文件)。它还支持嵌套存档(罐中的罐)。



0

只要此文件不是.class,即资源文件或清单文件,就可以。


以及如何在不提取和重新震撼的情况下?
2011年

0

我发现在Windows中执行此操作的最简单方法是WinRAR

  1. 右键单击该文件,然后从上下文菜单中选择“使用WinRAR打开”。
  2. 导航到要编辑的文件,然后双击该文件以在默认编辑器中将其打开。
  3. 进行更改后,保存并退出编辑器。
  4. 然后将出现一个对话框,询问您是否要更新档案中的文件-选择“是”,将更新JAR。

0

上面的大多数回答都说您不能对类文件执行此操作。

即使您要更新类文件,也可以这样做。 您需要做的就是将类文件从您的工作区拖放到jar中。

如果要验证对类文件的更改,可以使用jd-gui之类的反编译器来完成。

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.