java - 不一致的 java.util.zip.ZipException : ZipFile invalid LOC header on gradle project

标签 java gradle exception jdbc

我知道已经有一些关于这个问题的问题被问到,但建议的解决方案似乎对我没有任何作用。
具体导致该问题的库在 build.gradle 中定义为:

compile group:'org.xerial', name:'sqlite-jdbc', version:'3.8.11.2'
这里最大的问题是错误不一致。我正在运行一个永久启动的 java 服务器,该服务器有时会崩溃,有时不是由于此错误:
Caused by: java.util.zip.ZipException: ZipFile invalid LOC header (bad signature)
我没有可靠的方法来重现它,因为它每 10 或 20 次只会出现一次,但它似乎是完全随机的,有时可能会连续出现多次。
我曾尝试清除 gradle 缓存并重新安装 jar,但这似乎没有帮助。我发现的所有解决方案都与 maven 有关,但我不确定在使用 gradle 时如何做到这一点(可能是误解,但我假设 maven 和 gradle 项目是不同的东西)。
预计到达时间:
完整的堆栈跟踪:
java.lang.NoClassDefFoundError: org/sqlite/ExtendedCommand
        at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:106)
        at a.DBInterface.saveRow(DBInterface.java:143)
        at a.DBInterface.saveRow(DBInterface.java:113)
        at a.As.savePlayerData(As.java:965)
        at a.As.lambda$init$10(As.java:309)
        at arc.Events.lambda$fire$2(Events.java:26)
        at arc.struct.Array.each(Array.java:181)
        at arc.Events.fire(Events.java:26)
        at arc.Events.fire(Events.java:21)
        at min.core.NetServer.onDisconnect(NetServer.java:489)
        at min.core.NetServer.lambda$new$3(NetServer.java:88)
        at min.net.Net.handleServerReceived(Net.java:266)
        at min.net.ArcNetProvider$2.lambda$disconnected$1(ArcNetProvider.java:103)
        at arc.backend.headless.HeadlessApplication.executeRunnables(HeadlessApplication.java:120)
        at arc.backend.headless.HeadlessApplication.mainLoop(HeadlessApplication.java:89)
        at arc.backend.headless.HeadlessApplication$1.run(HeadlessApplication.java:63)
Caused by: java.lang.ClassNotFoundException: org.sqlite.ExtendedCommand
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:460)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 16 more
Caused by: java.util.zip.ZipException: ZipFile invalid LOC header (bad signature)
        at java.base/java.util.zip.ZipFile$ZipFileInputStream.initDataOffset(ZipFile.java:1003)
        at java.base/java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:1013)
        at java.base/java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:468)
        at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
        at java.base/jdk.internal.loader.Resource.getBytes(Resource.java:124)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:545)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
        ... 21 more

最佳答案

看起来您的构建正在创建一个其中嵌入了其他 JAR 的 JAR,并且有时您正在嵌入一个损坏的 sqlite-jdbc JAR 副本。
当 Gradle 从...下载 JAR 文件时,问题就会发生,无论您的 Gradle 配置说要从哪里下载。有时您会得到一个截断的 JAR (ZIP) 文件,或者您可能会得到一个错误页面,该页面被保存为缓存中的 JAR 文件。
现在这在构建时(可能)没有显示为问题,因为构建不需要从 sqlite-jdbc JAR 中读取类。 (您的应用程序将动态绑定(bind)到 JDBC 驱动程序......)。
如何解决?
第一步是查看其中一个损坏的 JAR 文件。尝试使用 jar -t ... 列出其内容.如果失败,请尝试在文本编辑器中打开它,看看它是否真的是一个错误页面。如果是这样,那将为您提供一些关于导致问题的线索。
第二步是查找并修复损坏的 JAR 的原因。
它可能是“离墙”的东西。例如,在我的一个工作场所,我需要记住每周“登录”一次互联网代理。如果我忘记了,并尝试进行 Maven 构建,我的 .m2repository 中会出现 HTML 文档。缓存。另一种可能性是 Gradle 正在通过一个存在某种间歇性问题的 maven 存储库获取依赖项。

关于java - 不一致的 java.util.zip.ZipException : ZipFile invalid LOC header on gradle project,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64084380/

相关文章:

java - 关于如何打印 "ALL"最长字符串的问题,该字符串具有存储在数组(JAVA)中的最长长度()

android - 使用android studio混淆多个模块

java - Maven-publish gradle插件跳过版本

java - 限制一个类被实例化不超过五次

c++ - 你如何调试 MinGW 异常处理?

java - 如何使用 Swing 创建布局?

java - 用新项目替换 Jframe 的内容会返回空白 Jframe

java - 如何在Spring中自定义SpEL解析器?

android - 无法解析 : exifinterface

c# - Resharper (2016.1 C#) 可以建议用 try catch block 捕获异常吗?