为了账号安全,请及时绑定邮箱和手机立即绑定

java.lang.NoClassDefFoundError怎么解决

java.lang.NoClassDefFoundError怎么解决

森林海 2019-03-21 10:15:43
如图所示代码截图,我再调试项目的时候,在这行:SSRFChecker ssrfChecker = SSRFChecker.instance;跑出了异常,异常信息为:java.lang.NoClassDefFoundError: com/alibaba/fasttext/sec/url/SSRFChecker可是我的项目中,明明有import com.alibaba.fasttext.sec.url.SSRFChecker;并且你看我的jar包中也有这个类的啊,编译的时候也是通过的,我已经clean rebuild了若干次,并且重启了服务若干次,关机重启了若干次,还是出现这个问题。非常困惑,为什么编译的时候没有问题,调试的时候,到这行就会抛这个异常信息呢?求大神解答。。谢谢~~说明,我的jar包是maven仓库导入的:        <dependency>              <groupId>com.alibaba.platform.shared</groupId>              <artifactId>fasttext-sec</artifactId>              <version>1.3.99</version>        </dependency>        回答楼下的,我编译后的jar包里是有的。
查看完整描述

8 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

正如javadoc中解释的那样,NoClassDefFoundError出现的原因是问题类在编译时是存在的,但在之后(如运行时)找不到。结合你的实际,我认为可能会有两种情况导致了改错误:

  • 就像楼上有人说的那样,如果是web工程,调试时本地发布时jar包缺失,检查本地发布路径下的jar包是否有缺失。

  • 引入的jar包自身有问题,如果jar包(com.alibaba.platform.shared:fasttext-sec:1.3.99)本身含有错误,编译时虽能定位到class,但在运行时该class由于包含错误没能被JVM或Classloader加载(错误通常发生在静态块或静态成员上),也会导致该错误。举个例子:

    // Demo.javapublic class Demo {
       static int num = 1 / 0;
       ...
    }

    如果jar包中包含Demo类,在外部调用Demo时,编译时不会有错误提示,但运行时会出现NoClassDefFoundError错误。


查看完整回答
反对 回复 2019-04-19
?
富国沪深

TA贡献1790条经验 获得超9个赞

到tomcat下把包删了,work目录下的也删了,工程重新部署到tomcat试试


查看完整回答
反对 回复 2019-04-19
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

看看你的包是不是引错了。重新引一下你的这个包。


查看完整回答
反对 回复 2019-04-19
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

是不是包有了冲突?包冲突也会有这种情况发生


查看完整回答
反对 回复 2019-04-19
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

楼主的问题有点诡异。让我猜测一下,由于楼主用的是maven,因此eclipse里面的项目应该分成多个模块了,而楼主在eclipse启动这个程序,应该是运行某个模块里面的一个含有main方法的类,而这个模块里面应该也有一个pom.xml。

在eclipse调试程序的时候,记得在pom.xml里面引入一些dependency。并且这些dependency的scope应该是runtime


        <dependency>

            <groupId>${project.parent.groupId}</groupId>

            <artifactId>aaa-xxx</artifactId>

            <version>${project.parent.version}</version>

            <scope>runtime</scope>

        </dependency>

以上纯属猜测。


查看完整回答
反对 回复 2019-04-19
?
狐的传说

TA贡献1804条经验 获得超3个赞

你这应该是单利吧。单利这样写就是错误的,你直接就可以用,为什么又要用另外一个引用来使用你的单利。单利不允许在外边创建对象的


查看完整回答
反对 回复 2019-04-19
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

应该很有可能是类加载的问题。虽然运行时有这个加载这个类,但是可能是由别的什么classloader加载的。

你加上 Thread.currentThread().getContextClassLoader(), 断点看下classes中都有哪些类,还有parent中的classes等,如果找不到SSRFChecker,你就要检查下代码上下文了,是不是有对classloader的设置

java类加载简单来说是先从parent中搜索,如果找不到再从当前classloader搜索,如果再找不到则抛出classnotfoundexception。搜"java 类加载机制" 了解更多

P.S. 这中问题在OSGI环境简直不要太常见


查看完整回答
反对 回复 2019-04-19
  • 8 回答
  • 0 关注
  • 4150 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号