如何解决ClassNotFoundException引起的NoClassDefFoundError?

时间:2017-01-09 08:13:10

标签: java eclipse jar noclassdeffounderror classnotfoundexception

我正在尝试为BlueJ制作扩展程序(这是为初学者设计的免费Java Development Environment)。扩展应该帮助我们学校的一年级学生。 扩展名必须是JAR文件,我必须将其放在BlueJ可以在runtime加载的文件夹中。我已编写的扩展名可以从那里加载,并且没有任何问题。

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

  

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

NtbBlueJExtension.java:79进行初始化:

`codeAnalysisHandler = new CodeAnalysisHandler();`

CodeAnalysisHandler课程中,我从checkstyle libraries

导入
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>

解: 使用带有fat jar plugin的Eclipse Kepler(Neon对于插件来说是新的)并使用'Build Fat Jar'导出项目。之后,'java.lang.ClassNotFoundException'不再出现了。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

来自Java Document

  

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

如果要在扩展jar中包含checkstyle,则必须将其爆炸到主jar中。有关详细信息,请查看this

Here是使用Gradle的示例。