在 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的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2.0.0.M6 和文件上传超过 10 MB
spring boot + mybatis批量插入大量数据(超过10000条)
为啥在 Win7 64bit 中不能通过 'ntQuerySystemInformation' 获取超过 65535 的进程 ID?