我想修改jar中的文件。是否有可能在我的应用程序中没有提取和重新震动的情况下执行此操作?
我要修改的文件是配置文件,主要是基于xml的。
我感兴趣的原因是我不感兴趣是应用程序用launch4j包装,如果我解开它我不能再次创建.exe文件。
答案 0 :(得分:73)
您可以使用u
jar
选项
来自Java教程:
jar uf jar-file input-file(s)
“存档中已存在的文件与添加的文件具有相同的路径名将被覆盖。”
比整个罐子重新制作好多了。从你的程序中调用它听起来也是可能的。试试Running Command Line in Java
答案 1 :(得分:17)
你可以使用Vim:
vim my.jar
如果您的环境中有unzip
,Vim可以编辑压缩文本文件。
答案 2 :(得分:9)
Java jar文件的格式与zip文件的格式相同 - 因此,如果您有一个可以让您修改存档的zip文件实用程序,那么您就可以轻松上门了。第二个问题是,如果你想重新编译一个类或者什么东西,你可能只需要重新构建jar;但是文本文件或其他东西(例如xml)应该很容易被修改。
答案 3 :(得分:7)
正如许多人所说,如果不重新安装JAR,就无法更改JAR中的文件。使用Launch4J更糟糕的是,一旦更改了JAR,就必须重建EXE。所以不要走这条路。
将配置文件放在JAR中通常是个坏主意。这是我的建议。在某些预定位置搜索配置文件(如主目录,\ Program Files \ etc)。如果找到配置文件,请使用它。否则,使用JAR中的那个作为后备。如果这样做,您只需要在预先确定的位置编写配置文件,程序就会将其取出。
此方法的另一个好处是,如果升级软件,修改后的配置文件不会被覆盖。
答案 4 :(得分:2)
这可能比你想要在短期内处理更多的工作,但我怀疑从长远来看,使用Ant(或{{3} },甚至Maven)而不是手动构建jar。这样你就可以点击ant文件(如果你使用Eclipse)并重建jar。
或者,您可能希望实际上根本没有这些配置文件 - 如果您希望定期更换这些文件,或者它应该分发给多方,则配置文件不应该成为罐子的一部分。
答案 5 :(得分:2)
不确定是否有此帮助,但您可以在不提取的情况下进行编辑:
查看博客文章了解更多详情 http://vinurip.blogspot.com/2015/04/how-to-edit-contents-of-jar-file-on-mac.html
答案 6 :(得分:1)
要扩展dfa所说的,原因是因为jar文件设置为zip文件。如果要修改文件,则必须读出所有条目,修改要更改的条目,然后将条目写回jar文件。我以前必须这样做,这是我能找到的唯一方法。
修改强>
请注意,这是使用Java jar文件内部编辑器,它们是文件流。我确信有一种方法可以做到,你可以将整个jar读入内存,修改所有内容,然后写回文件流。这就是我认为7-Zip和其他公用事业公司正在做的事情,因为我认为必须在写入时定义一个zip标题的ToC。但是,我可能是错的。
答案 7 :(得分:1)
是的,您可以使用SQLite从jar文件中读取或写入数据库,这样您就不必解压缩然后重新启动它,按照我的帖子http://shoaibinamdar.in/blog/?p=313
使用语法“jdbc:sqlite :: resource:”,您将能够从jar文件中读取和写入数据库
答案 8 :(得分:1)
查看TrueZip。
它完全符合您的要求(通过虚拟文件系统API在jar文件中编辑内联文件)。它还支持嵌套存档(jar中的jar)。
答案 9 :(得分:1)
提取jar文件以获取。使用winrar并使用CAVAJ:
Cavaj Java Decompiler是一个图形免费软件实用程序,可以从CLASS文件重建Java源代码。
如果您需要,这里是视频教程: https://www.youtube.com/watch?v=ByLUeem7680
答案 10 :(得分:0)
只要此文件不是.class,即资源文件或清单文件 - 您就可以。
答案 11 :(得分:0)
我发现在Windows中执行此操作的最简单方法是使用WinRAR:
答案 12 :(得分:0)
上面的大多数回答都说您不能对课程文件执行此操作。
即使您要 更新课程文件,也可以这样做。 您需要做的就是将类文件从您的工作区拖放到jar中。
如果要验证对类文件的更改,可以使用jd-gui之类的反编译器来完成。
答案 13 :(得分:0)
我有类似的问题,我需要修改/更新 jar 文件中的 xml 文件。
jar 文件由 Spring-boot 应用程序创建,文件位置为 BOOT-INF/classes/properties
我指的是这个 document 并试图用这个命令替换/更新文件:
<块引用>jar uf myapp.jar BOOT-INF/classes/properties/test.xml
但是这样,它不会更改给定位置的文件。我也尝试了所有选项,但不起作用。
注意:我从 jar 文件所在的位置执行的命令。
我找到的解决方案是:
jar 文件中的 xml 文件已更改。
基本上,您需要创建一个文件夹结构,例如文件在 jar 文件中的位置。复制该位置的文件,然后执行命令。
文档的问题在于,它没有足够的示例以及对常见场景的解释。