繁体   English   中英

运行时NoClassDefFoundError Jar

[英]NoClassDefFoundError when running Jar

我有这个问题。 当我在 Intellij 中运行我的代码时它工作正常,但如果我做一个工件并构建 jar,它就不起作用。 我认为它是由外部库引起的。 这是我的 output:

Exception in thread "main" java.lang.NoClassDefFoundError: com/mindfusion/scheduling/Calendar
        at GUI.<init>(GUI.java:75)
        at Logfiles.main(Logfiles.java:13)
Caused by: java.lang.ClassNotFoundException: com.mindfusion.scheduling.Calendar
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 2 more

我知道它是哪个 Class 但我不知道如何解决问题。 我真的只是一个初学者。 你能帮我解释一下吗? 谢谢

编辑:

在我使用提取的库构建工件后出现此错误:错误:发生 JNI 错误,请检查您的安装并重试线程“main”中的异常 java.lang.SecurityException:清单主要属性的签名文件摘要无效

此错误仅表示 class 文件不存在于 jar 中。

一种可能的解决方案是您可以下载用于查看 jars的 jd-gui 。您可以使用它来检查 class 是否存在。

另一种解决方案是您可以使用此简单命令 grep 在 jar 中搜索 class。

grep -l "<class-name>" <jar-name>.jar

如果 class 不存在于 jar 文件中。 您可以使用 jar 命令添加 class。

jar -cvf <jar-absolute-location> <class-path>
eg : jar -cvf GUI.jar com.mindfusion.scheduling.Calendar

理解这个问题的最简单方法是阅读 class 的 Javadoc。来自 Javadoc:

如果 Java 虚拟机或 ClassLoader 实例尝试加载 class 的定义(作为正常方法调用的一部分或作为使用 new 表达式创建新实例的一部分)并且找不到 class 的定义,则抛出。

编译当前执行的class时,搜索到的class定义存在,但找不到了。

这意味着当特定的 class 在编译时出现但在运行时不知何故不可用时,可以抛出NoClassDefFoundError 这可能是由于缺少 JAR 文件、权限问题或运行时的类路径不正确

通常,当开发人员忽略为使用的库定义类路径时,我会看到这些问题。 他们忘记了您的 IDE 有自己的定义类路径的文件(即 Eclipse 有.classpath文件),因此从 IDE 运行应用程序工作正常(类在编译时存在),但在编译应用程序之后类路径不存在在托管应用程序的机器中定义, NoClassDefFoundError被抛出(运行时类“缺失”)。

如果类路径正确,我的建议首先被弄清楚。 多于没有,这就是问题所在。 如果类路径正确,请确保正确设置了所有权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM