idea引入本地工具jar包调试提示NoClassDefFoundError、ClassNotFoundException

idea引入本地工具jar包调试提示NoClassDefFoundError、ClassNotFoundException

  • 1 情况描述
  • 2 问题排除步骤
    • 2.1 剥离springboot项目测试
    • 2.2 剥离maven测试
    • 2.3 重新测试jar打包
    • 2.4 测试META-INF
  • 3 最终结论

网上有很多文章都有遇到该问题,基本上都是本地运行调试正常,但都在服务器部署阶段提示该问题,极少有在本地调试就提示该类错误的。
本菜鸟在自己的springboot项目中引入了自己封装的工具包,就发生这个情况,而且排除和解决问题花了2天时间。现在做情况记录,避免自己再犯相同错误,同时也为遇到相同情况的小伙伴提供一个解决问题的思路,如果你也有类似的情况,说不定咱们犯了一样的错误。

先给出解决问题的结论:在用idea打包jar的时候,一定要自己指定一个新的META_INF的生成目录,不要使用默认目录,就能避免这个错误!

1 情况描述

1.自己封装的工具类,单独代码调试时一切正常;
2.使用idea工具进行jar打包
3.在其他项目引入该工具类jar包,并调用其方法进行本地调试时,会输出NoClassDefFoundError、ClassNotFoundException等错误。

2 问题排除步骤

网上有很多springboot和maven引入第三方包或者本地包的教程,这里不再赘述,大家自行参考即可,本文主要记录问题定位及解决思路。

2.1 剥离springboot项目测试

最开始,以为是springboot中引入包的方式或者其他依赖注入等操作的姿势不正确导致的问题,因此先选择剥离springboot,避免springboot对问题的干扰。
解决方法:
通过新建一个简单的maven项目,引入自己封装的jar包来调用测试。
测试结果:
仍然提示同样的错误。
测试结论:
该错误与springboot无关。

2.2 剥离maven测试

此时测试项目中只有maven,需要排除是否是maven引入本地jar包的方式不对。
解决方法:
新建空的java项目,并新建lib文件夹,手动复制放入自己封装的jar包,并引入项目中。
测试结果:
仍然提示错误。
测试结论:
与maven无关,最终定位问题在于jar包本身打包的问题上。

2.3 重新测试jar打包

最终问题很有可能因为自己打包的某个设置出错了。
解决方法:
重新学习如何用idea操作jar打包,并明确每个设置的含义。
此处推荐idea打包java可执行jar包,文章对每个设置内容都进行了详细的讲解和说明。但因为自己学习的时候不够细心,跳过了某个默认值的设置,最终为本文的错误埋下了伏笔。
测试结果:
利用java -jar指令执行jar包时,提示了“没有主清单属性”的错误。
测试结论:
在指定main class或者META-INF的时候出现错误了。

2.4 测试META-INF

到这一步,通过上一步骤的问题提示及资料查阅,基本上断定是META-INF出问题了,打开jar包查看发现MANIFEST.MF中并没有指定main class。
再次回顾打包步骤的META-INF设置,注意蓝色方框内的问题,我就是使用了默认位置,导致该文件出现错误,才导致了后续一系列的问题。
idea引入本地工具jar包调试提示NoClassDefFoundError、ClassNotFoundException_第1张图片
测试方法:
修改meta-inf的生成路径。
测试结果:
引入工具包,成功运行。
测试结论:
使用idea的默认meta-inf的生成路径,在我电脑上会导致jar包打包的错误。具体原因还需要进一步查阅资料核实。

3 最终结论

要修改idea中默认的META-INF的生成路径,确保生成的包可用。

你可能感兴趣的:(java,java)