【发布时间】: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