【问题标题】:How to solve a NoClassDefFoundError caused by ClassNotFoundException?如何解决由 ClassNotFoundException 引起的 NoClassDefFoundError?
【发布时间】:2017-01-09 08:13:10
【问题描述】:

我正在尝试扩展BlueJ(这是为初学者设计的免费Java Development Environment)。扩展应该可以帮助我们学校的一年级学生。 扩展必须是一个 JAR 文件,我必须将它放在一个文件夹中,BlueJ 可以在 runtime 加载它。我已经写好的扩展可以从那里加载,它可以正常工作。

现在说说这个问题的原因: 我想将checkstyle(这是一个帮助程序员编写符合编码标准的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) 在 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) 在 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 at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 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”不再出现。

感谢您的帮助。

【问题讨论】:

  • 确保您的 jar 文件包含 checkstyle 库。查看此链接 (stackoverflow.com/questions/11033603/…) 了解更多信息。
  • @MinhHoàng 我解压缩了我的扩展 JAR 文件,并且 checkstyle-all.jar 在 lib 文件夹中。所以这应该没问题吧?
  • @MinhHoàng 我用一些新信息编辑了我的问题。谢谢。

标签: java eclipse jar noclassdeffounderror classnotfoundexception


【解决方案1】:

来自Java Document

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

如果要在扩展 jar 中包含 checkstyle,则必须将其分解到主 jar 中。请查看this 了解更多信息。

Here 是使用 Gradle 的示例。

【讨论】:

  • 好的,我会试一试。但是 bluejext.jar 完全按照我描述的方式在我的 jar 中工作。有没有可能这个带有“fatjar”的解决方案只对某些罐子是必需的?
  • 这是因为bluejext.jar是bluej提供的,而checkstyle不是。我认为如果您将 checkstyle-all.jar 添加到 bluej 的 lib 文件夹中,它可能会起作用。
  • 更详细一点,bluej 不使用扩展 jar 中的 bluejext.jar,而是使用 bluej 的 lib 文件夹中的那个。
  • 啊!这解释了为什么 bluejext.jar 有效...我在 bluej 的 lib 文件夹中添加了 checkstyle-all.jar(与 bluej 中的 bluejext.jar 相同的目录)。它没有用。我认为我的 jar 中的代码在该 lib 文件夹中找不到 checkstyle jar? (我仍在尝试制作这个胖罐子,但我从未使用过 gradle,所以我必须先研究一下。)
  • 也许 bluej 使用自定义代码来加载 jar 文件,我不确定。如果你对 gradle 不熟悉,你可以试试 maven assembly plugin (for Maven) 或者 eclipse fat jar plugin (从不使用它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多