Java 如何解决ClassNotFoundException导致的NoClassDefFoundError?

Java 如何解决ClassNotFoundException导致的NoClassDefFoundError?,java,eclipse,jar,noclassdeffounderror,classnotfoundexception,Java,Eclipse,Jar,Noclassdeffounderror,Classnotfoundexception,我正在尝试为做一个扩展(这是一个为初学者设计的免费Java开发环境)。延期应该对我们学校一年级的学生有帮助。 扩展名必须是一个JAR文件,我必须把它放在一个文件夹中,BlueJ可以在运行时加载它。我已经编写的扩展可以从那里加载,它可以毫无问题地工作 现在谈谈这个问题的原因: 我想将(这是一个帮助程序员编写符合编码标准的Java代码的开发工具)集成到我的扩展中。所以我把checkstyle jar放在我的项目中,并尝试在代码中使用这个库。如果我现在生成一个jar并将扩展复制到BlueJ文件夹中,然

我正在尝试为做一个扩展(这是一个为初学者设计的免费
Java开发环境)。延期应该对我们学校一年级的学生有帮助。
扩展名必须是一个JAR文件,我必须把它放在一个文件夹中,
BlueJ
可以在
运行时加载它。我已经编写的扩展可以从那里加载,它可以毫无问题地工作

现在谈谈这个问题的原因: 我想将(这是一个帮助程序员编写符合编码标准的Java代码的开发工具)集成到我的扩展中。所以我把
checkstyle jar
放在我的项目中,并尝试在代码中使用这个库。如果我现在生成一个jar并将扩展复制到
BlueJ
文件夹中,然后从eclipse中启动
BlueJ
,我会得到以下错误:

java.lang.NoClassDefFoundError: com/puppycrawl/tools/checkstyle/api/CheckstyleException位于 ch.ntb.sir.ntbbluejextension.ntbbluejextension.startup(ntbbluejextension.java:79) 在 bluej.extmgr.ExtensionWrapper.safeStartup(ExtensionWrapper.java:533) 在 extmgr.ExtensionWrapper.newExtension(ExtensionWrapper.java:209) 在 bluej.extmgr.extensionManager.loadDirectoryExtensions(extensionManager.java:164) 在 bluej.extmgr.extensionManager.loadExtensions(extensionManager.java:100) 在 bluej.extmgr.extensionmanager.getInstance(extensionmanager.java:61) 在bluej.Main.(Main.java:101)在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:422) 位于java.lang.Class.newInstance(Class.java:442) bluej.Boot.bootBluej(Boot.java:348)位于bluej.Boot.main(Boot.java:175) 原因:java.lang.ClassNotFoundException:com.puppycrawl.tools.checkstyle.api.CheckstyleException位于 java.net.URLClassLoader.findClass(URLClassLoader.java:381)位于 loadClass(ClassLoader.java:424)位于 loadClass(ClassLoader.java:357)。。。14多

NtbBlueJExtension.java:79
中,我进行以下初始化:

`codeAnalysisHandler = new CodeAnalysisHandler();`
CodeAnalysisHandler
类中,我从
checkstyle库导入了以下内容:

import com.puppycrawl.tools.checkstyle.Checker;
import com.puppycrawl.tools.checkstyle.ConfigurationLoader;
import com.puppycrawl.tools.checkstyle.PropertiesExpander;
import com.puppycrawl.tools.checkstyle.TreeWalker;
import com.puppycrawl.tools.checkstyle.api.AuditEvent;
import com.puppycrawl.tools.checkstyle.api.AuditListener;
import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
import com.puppycrawl.tools.checkstyle.api.Configuration;
我的第一个想法是,我应该在那里找到问题的原因?但是我不知道该搜索什么以及如何解决它

我已经在eclipse的项目属性中添加了jar。 Jar位于我的
lib
文件夹中的项目结构中
BlueJ
从“lib”文件夹加载
bluejext.jar
没有问题。
bluejext.jar
来自
BlueJ
,它是为BlueJ编写扩展所必需的。 我有这个清单文件:

Manifest-Version: 1.0
Main-Class: ch.ntb.sir.ntbbluejextension.NtbBlueJExtension
Class-Path: lib/bluejext.jar lib/checkstyle-all.jar
我试着在谷歌上搜索,但大部分信息都显示要找到原因有多难

编辑1: 我解压缩了JAR文件以查看
checkstyle all.JAR
是否真的在我的扩展名中,并且在那里我找到了一个文件
.classpath

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
    <classpathentry kind="lib" path="lib/bluejext.jar"/>
    <classpathentry kind="lib" path="lib/checkstyle-all.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

解决方案: 将EclipseKepler与(Neon是插件的新功能)一起使用,并使用“BuildFatJar”导出项目。此后,“java.lang.ClassNotFoundException”不再出现

感谢您的帮助。

发件人:

类路径头指向本地网络上的类或JAR文件,而不是JAR文件中的JAR文件或可通过Internet协议访问的类

如果要在扩展jar中包含
checkstyle
,必须将其分解到主jar中。有关更多信息,请参阅


是一个使用Gradle的示例。

确保jar文件包含checkstyle库。查看此链接()以了解更多信息。@MinhHoáng我解压缩了扩展JAR文件,checkstyle-all.JAR在lib文件夹中。这应该没问题吧?@MinhHoáng我用一些新信息编辑了我的问题。谢谢。好的,我试试看。但是bluejext.jar在我的jar中工作得非常好,就像我描述的那样。这个带有“fatjar”的解决方案是否可能只是某些jar所必需的?这是因为bluejext.jar是由bluej提供的,而checkstyle不是。我认为如果您将checkstyle-all.jar添加到bluej的lib文件夹中可能会起作用。更详细地说,bluej在扩展jar中使用的不是
bluejext.jar
,而是bluej.Ah的
lib
文件夹中的!这就解释了为什么bluejext.jar可以工作。。。我在bluej的lib文件夹中添加了checkstyle-all.jar(与bluej中的bluejext.jar目录相同)。它不起作用。我想我在jar中的代码在lib文件夹中找不到checkstyle jar?(我仍在尝试制作这个胖jar,但我从未与gradle合作过,所以我必须先研究一下。)也许bluej使用自定义代码来加载jar文件,我对此不确定。如果您不熟悉gradle,您可以尝试maven汇编插件(适用于maven)或EclipseFatJar插件(但永远不要使用它)。