我正在用Java开发一个应用程序,它需要将文件修补到某个.jar
文件,然后运行jar。我使用'zipfile'库在Python中编写了此应用程序的先前版本,该库修补了jar并成功运行了它。但是,当我尝试运行jar(从命令行使用java.exe)时,Java应用程序会根据运行时创建一个“无效或损坏”的jar文件,即使7-zip可以正常打开jar文件。作为参考,Python邮政编码如下:
import os
import zipfile
def extractzipfile(filename, target):
with zipfile.ZipFile(filename, 'r') as z:
for name in z.namelist():
if name.endswith("/"):
continue
if not os.path.isdir(os.path.dirname(os.path.join(target, name))):
try:
os.makedirs(os.path.dirname(os.path.join(target, name)))
except:
pass
with open(os.path.join(target, name), "wb") as f:
f.write(z.read(name))
def compresszipfile(directory, target):
with zipfile.ZipFile(target, 'w') as z:
for root, directories, files in os.walk(directory):
for file in files:
z.write(os.path.join(root, file), os.path.join(root.replace(directory, ""), file))
使用extractzipfile
提取jarfile,修补并使用compresszipfile
重新压缩。我的新Java应用程序版本使用zip4j来处理压缩和解压缩。 Java中的代码如下:
public static void decompressZipfile(String zipFile, String outputDir) throws ZipException {
ZipFile zip = new ZipFile(zipFile);
zip.extractAll(outputDir);
}
public static void compressZipfile(String sourceDir, String outputFile) throws ZipException {
ZipFile zip = new ZipFile(outputFile);
ZipParameters params = new ZipParameters();
params.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
params.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
for (File f : new File(sourceDir).listFiles()) {
if (f.isDirectory()) {
zip.addFolder(f, params);
} else {
zip.addFile(f, params);
}
}
}
和以前一样,使用上述方法提取,修补和重新压缩jar文件。
所以我的问题是:当Python应用程序没有时,有没有人对Java应用程序为什么生成损坏的jar文件有任何想法? Python创建的zipfiles和zip4j / Java zipfiles之间有区别吗?
另请注意:在Python应用程序中没有以任何方式修改META-INF文件夹,并且jar运行得很好,所以这不应该成为问题的一个因素。如果我弄错了,请纠正我。
如果我需要提供有关此问题的更多信息,请与我们联系。