在 Spring boot 中添加超过 65535 个条目的 jar

Posted

技术标签:

【中文标题】在 Spring boot 中添加超过 65535 个条目的 jar【英文标题】:Add more than 65535 entries jar in Spring boot 【发布时间】:2018-11-11 19:38:12 【问题描述】:

我创建了一个自定义的句子间语义相似度算法。项目创建了 65535 个条目 jar,因为它包含 100,000 个单词。我使用“mvn install:install-file”将自定义 jar 添加到我的 spring boot 项目并创建了 boot jar,但是每当我运行项目时,我都会收到此错误。

Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/semantics-1.0.jar
    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:109)
    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:87)
    at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:72)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/semantics-1.0.jar'
    at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:252)
    at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:237)
    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:104)
    ... 4 more
Caused by: java.lang.IllegalStateException: Zip64 archives are not supported
    at org.springframework.boot.loader.jar.CentralDirectoryEndRecord.getNumberOfRecords(CentralDirectoryEndRecord.java:124)
    at org.springframework.boot.loader.jar.JarFileEntries.visitStart(JarFileEntries.java:91)
    at org.springframework.boot.loader.jar.CentralDirectoryParser.visitStart(CentralDirectoryParser.java:88)
    at org.springframework.boot.loader.jar.CentralDirectoryParser.parse(CentralDirectoryParser.java:56)
    at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:118)
    at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:106)
    at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:290)

 at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:260)
    at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:248)
    ... 6 more 

【问题讨论】:

如果我理解正确的话,它是DATA(即不是java代码),那么为什么需要jar? ...顺便说一句,我通过 Java 创建了 1GB Zip(速度慢,但有效) 是的,它是数据,而不是 java 代码。如果每次更改代码都需要 3 个小时来编译构建,那将非常麻烦。任何建议都可以在这里提供帮助 Zip64 档案不受支持 创建一个普通的 zip/jar 来代替? 编辑了我的问题。请立即查看。 我会认真重新考虑您如何处理您的数据。 【参考方案1】:

Spring boot 将不支持 jar 中超过 65534 个文件。这是他们的代码。

public int getNumberOfRecords() 
        long numberOfRecords = Bytes.littleEndianValue(this.block, this.offset + 10, 2);
        if (numberOfRecords == 0xFFFF) 
            throw new IllegalStateException("Zip64 archives are not supported");
        
        return (int) numberOfRecords;
    

由于它的数据文件,将其保存在 jar 之外,这也将减少构建时间。

【讨论】:

【参考方案2】:

见https://github.com/spring-projects/spring-boot/issues/2895

关键错误是:

Caused by: java.lang.IllegalStateException: Zip64 archives are not supported

55mb 不需要 Zip64 格式,您可能应该更改创建文件的方式。

【讨论】:

【参考方案3】:

Spring boot 2.2 将支持 zip64 jars Github issue

【讨论】:

【参考方案4】:

我知道这不是一个好习惯,但我的 spring 项目现在运行良好,因为我将我的依赖项整个包包含到 spring 项目中,而不是创建一个依赖项的 jar 然后导入它。

【讨论】:

以上是关于在 Spring boot 中添加超过 65535 个条目的 jar的主要内容,如果未能解决你的问题,请参考以下文章

解决安卓中单个dex方法数超过65535的方法

Spring Boot 2.0.0.M6 和文件上传超过 10 MB

Android开发中方法数超过65535的简单解决方法

java导出excel数据超过65535

spring boot + mybatis批量插入大量数据(超过10000条)

为啥在 Win7 64bit 中不能通过 'ntQuerySystemInformation' 获取超过 65535 的进程 ID?