当类存在时,为什么我手动构建的可运行 jar 会响应“错误:无法找到或加载主类”?

问题描述 投票:0回答:1

这是经常出现的错误消息之一,但没有一个问题/答案能够解决这种特殊情况。

  • 我正在从 Eclipse 项目的内容创建一个可运行的 jar。
  • 当我使用 Eclipse IDE 创建可运行的 jar 时,它可以工作。
  • 当我 使用
    java.util.zip.*
    函数来创建可运行的 jar,它确实 工作。
  • 当我在 Windows 资源管理器中比较这两个文件时,它们是相同的。
  • 当我提取 zip 文件并比较磁盘上的结果内容(使用 WinMerge)时,它们是相同的。

为什么一个文件可以工作,而另一个看似相同的文件却不能工作?

这是我正在使用的代码片段。 不是完整的实现,只是有趣的一点:

    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 资源管理器告诉我的内容的唯一方法:这些文件彼此完全相同):

jar files expanded by Windows explorer show as identical and windows command prompt shows one works and other does not

java eclipse jar executable-jar runnable-jar
1个回答
0
投票

当我更仔细地分析这两个文件时,我看到了差异

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("\\","/");
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.