如何解决由 ClassNotFoundException 引起的 NoClassDefFoundError?
How to solve a NoClassDefFoundError caused by 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)
at
bluej.extmgr.ExtensionWrapper.safeStartup(ExtensionWrapper.java:533)
at
bluej.extmgr.ExtensionWrapper.newExtension(ExtensionWrapper.java:209)
at
bluej.extmgr.ExtensionsManager.loadDirectoryExtensions(ExtensionsManager.java:164)
at
bluej.extmgr.ExtensionsManager.loadExtensions(ExtensionsManager.java:100)
at
bluej.extmgr.ExtensionsManager.getInstance(ExtensionsManager.java:61)
at bluej.Main.(Main.java:101) at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442) at
bluej.Boot.bootBluej(Boot.java:348) at bluej.Boot.main(Boot.java:175)
Caused by: java.lang.ClassNotFoundException: com.puppycrawl.tools.checkstyle.api.CheckstyleException 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 more
在 NtbBlueJExtension.java:79
我进行了初始化:
`codeAnalysisHandler = new CodeAnalysisHandler();`
在 CodeAnalysisHandler
class 我从 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
我尝试 google 它,但发现大部分信息都是关于找到原因有多难。
编辑 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>
解决方案:
将 Eclipse Kepler 与 fat jar plugin(Neon 对于插件来说是新的)一起使用,并使用“Build Fat Jar”导出项目。之后'java.lang.ClassNotFoundException'就再也没有出现过。
感谢您的帮助。
The Class-Path header points to classes or JAR files on the local network, not JAR files within the JAR file or classes accessible over Internet protocols
如果要在扩展 jar 中包含 checkstyle
,则必须将其分解到主 jar 中。查看 this 了解更多信息。
Here 是使用 Gradle 的示例。
我正在尝试为 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) at bluej.extmgr.ExtensionWrapper.safeStartup(ExtensionWrapper.java:533) at bluej.extmgr.ExtensionWrapper.newExtension(ExtensionWrapper.java:209) at bluej.extmgr.ExtensionsManager.loadDirectoryExtensions(ExtensionsManager.java:164) at bluej.extmgr.ExtensionsManager.loadExtensions(ExtensionsManager.java:100) at bluej.extmgr.ExtensionsManager.getInstance(ExtensionsManager.java:61) at bluej.Main.(Main.java:101) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at java.lang.Class.newInstance(Class.java:442) at bluej.Boot.bootBluej(Boot.java:348) at bluej.Boot.main(Boot.java:175) Caused by: java.lang.ClassNotFoundException: com.puppycrawl.tools.checkstyle.api.CheckstyleException 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 more
在 NtbBlueJExtension.java:79
我进行了初始化:
`codeAnalysisHandler = new CodeAnalysisHandler();`
在 CodeAnalysisHandler
class 我从 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
我尝试 google 它,但发现大部分信息都是关于找到原因有多难。
编辑 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>
解决方案: 将 Eclipse Kepler 与 fat jar plugin(Neon 对于插件来说是新的)一起使用,并使用“Build Fat Jar”导出项目。之后'java.lang.ClassNotFoundException'就再也没有出现过。
感谢您的帮助。
The Class-Path header points to classes or JAR files on the local network, not JAR files within the JAR file or classes accessible over Internet protocols
如果要在扩展 jar 中包含 checkstyle
,则必须将其分解到主 jar 中。查看 this 了解更多信息。
Here 是使用 Gradle 的示例。