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插件(但永远不要使用它)。