这是经常出现的错误消息之一,但没有一个问题/答案能够解决这种特殊情况。
java.util.zip.*
函数来创建可运行的 jar,它确实
不工作。为什么一个文件可以工作,而另一个看似相同的文件却不能工作?
这是我正在使用的代码片段。 不是完整的实现,只是有趣的一点:
ZipInputStream zin = new ZipInputStream(new FileInputStream(tempFile));
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile));
for (int i = 0; i < fileList.length; i++) {
InputStream in = new FileInputStream(fileList[i]);
String absoluteFileNameString = fileList[i].getAbsolutePath();
if (baseDirectory != null && baseDirectory.length() > 0 && absoluteFileNameString.length() > (baseDirectory.length() + 1) ) {
absoluteFileNameString = absoluteFileNameString.substring(baseDirectory.length() + 1);
}
out.putNextEntry(new ZipEntry(absoluteFileNameString));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();
}
out.close();
这是显示一个有效而另一个无效的输出:
C:\Users\Owner\git\runnablejarbuilder\RunnableJarBuilder>java -jar RunnableJarBuilder.zip
Error: Could not find or load main class com.rjb.test.HelloRun
Caused by: java.lang.ClassNotFoundException: com.rjb.test.HelloRun
C:\Users\Owner\git\runnablejarbuilder\RunnableJarBuilder>java -jar RunnableJarBuilderIDE.zip
Hello Runnable Jar!
下面是屏幕截图(捕获 Windows 资源管理器告诉我的内容的唯一方法:这些文件彼此完全相同):
当我更仔细地分析这两个文件时,我看到了差异。
C:\Users\Owner\git\runnablejarbuilder\RunnableJarBuilder\zipdump>C:\Users\Owner\AppData\Local\Programs\Python\Python38-32\python.exe zipdump.py RunnableJarBuilder.zip
75 ( 97.3%) 2024-11-18 12:27:10 106e3e9c [NOLFH] META-INF/MANIFEST.MF
7831 ( 48.9%) 2024-11-18 12:27:10 a30be143 [NOLFH] com\rjb\test\BuildJarFromClassFiles.class
4601 ( 53.4%) 2024-11-18 12:27:10 0742ac06 [NOLFH] com\rjb\test\ClasspathReader.class
561 ( 62.2%) 2024-11-18 12:27:10 d38480b3 [NOLFH] com\rjb\test\HelloRun.class
6525 ( 50.6%) 2024-11-18 12:27:10 364411d0 [NOLFH] com\rjb\test\JarUpdater.class
C:\Users\Owner\git\runnablejarbuilder\RunnableJarBuilder\zipdump>C:\Users\Owner\AppData\Local\Programs\Python\Python38-32\python.exe zipdump.py RunnableJarBuilderIDE.zip
75 ( 97.3%) 2024-11-18 12:25:54 106e3e9c [NOLFH] META-INF/MANIFEST.MF
4601 ( 53.4%) 2024-11-18 10:44:42 0742ac06 [NOLFH] com/rjb/test/ClasspathReader.class
7831 ( 48.9%) 2024-11-18 12:23:00 a30be143 [NOLFH] com/rjb/test/BuildJarFromClassFiles.class
561 ( 62.2%) 2024-11-18 09:02:48 d38480b3 [NOLFH] com/rjb/test/HelloRun.class
6525 ( 50.6%) 2024-11-18 09:46:12 364411d0 [NOLFH] com/rjb/test/JarUpdater.class
第一个输出是我创建的文件(不起作用)。 第二个输出是 IDE 创建(有效)的输出。 您会看到哈希值是相同的。 所有条目都是相同的。 或者是吗?
需要更改一行代码来解决问题。
这个问题导致我花了几个小时的时间进行搜索。
此问题在 Windows 上尤其可能出现,而在 Linux 上可能问题较少。
最终破解问题的工具是https://github.com/nlitsme/zipdump
Zipdump 是我用来分析这两个 zip 文件的工具。
解决方案如下:
//REPLACE THIS LINE
//String absoluteFileNameString = fileList[i].getAbsolutePath();
//WITH THIS LINE - Never use backslashes in zip file entries!!
String absoluteFileNameString = fileList[i].getAbsolutePath().replace("\\","/");