[英]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.