2009-08-03 38 views
57

我想修改我的罐子里面的文件。在我的应用程序中,是否可以在不提取和重新激励的情况下执行此操作?修改罐子里的文件

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

我感兴趣的原因不是不合理的是,应用程序包装与launch4j如果我unjar它我不能再次创建.exe文件。

+0

你为什么想这么做? – 2009-08-03 21:57:30

+0

我想在应用程序中保留补充文件,而不在文件系统上创建临时文件。 – 2009-08-03 22:02:09

+0

试试这个解决方案http://stackoverflow.com/a/4837522/1853864 我用了,我的问题解决了。 – 2012-11-28 12:22:09

回答

0

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

+0

和如何,没有提取和重新震动? – 2011-08-25 11:42:27

9

Java jar文件与zip文件的格式相同 - 所以如果你有一个zip文件实用程序可以让你修改一个存档文件,那么你的脚就在门外。第二个问题是,如果你想重新编译一个类或其他东西,你可能只需要重新构建jar;但是一个文本文件或者其他东西(例如xml)应该很容易修改。

1

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

编辑

注意,这是使用内部到Java jar文件的编辑,这是文件流。我确信有办法做到这一点,你可以将整个jar读入内存,修改所有内容,然后写回到文件流。这就是我相信像7-Zip和其他公用事业公司这样的公用事业公司,因为我相信在写入时必须定义zip头的ToC。但是,我可能是错的。

2

这可能比你想要在短期内处理更多的工作,但我认为从长远来看,使用Ant(或Maven,或甚至Bazel)将对你有帮助建立罐子的手动。这样你只需点击ant文件(如果你使用Eclipse)并重建jar。

或者,您可能实际上并不需要在jar中包含这些配置文件 - 如果您期望需要定期替换这些文件,或者它应该分发给多方,配置文件应该根本不是罐子的一部分。

+2

同意。但是,您可能希望在JAR中放置一个“默认”配置文件,因此如果外部设备发生某些事情(损坏,删除等),您可以回退到默认配置。 – 2009-08-03 22:16:22

+0

真的 - 虽然我不知道有多少应用程序将继续运作,没有他们的配置文件... – dimo414 2009-08-03 23:30:25

7

正如许多人所说的那样,如果不重新编写JAR文件,就不能更改JAR中的文件。 Launch4J更糟糕,您必须在更改JAR后重新编译EXE。所以不要走这条路。

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

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

1

是的,你可以使用SQLite您可以阅读或jar文件内写入到数据库中,这样你就不必提取,然后重新罐子,请按照我的帖子http://shoaibinamdar.in/blog/?p=313

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

1

检出TrueZip

它通过虚拟文件系统API完全符合你的要求(在jar文件内部编辑文件)。它也支持嵌套存档(罐子里面的jar)。 “在具有相同的路径名添加将被覆盖文件存档的任何文件了。”

jar uf jar-file input-file(s) 

1

提取ex文件的jar文件。使用winrar并使用CAVAJ:

Cavaj Java Decompiler是一个图形化的免费软件实用程序,用于重建CLASS文件中的Java源代码。

这里是视频教程,如果您需要: https://www.youtube.com/watch?v=ByLUeem7680

7

您可以用Vim:

vim my.jar

的Vim能编辑压缩的文本文件,给您的环境中有unzip

0

我发现这样做在Windows的最简单方法是使用WinRAR

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