先给出解决问题的结论:在用idea打包jar的时候,一定要自己指定一个新的META_INF的生成目录,不要使用默认目录,就能避免这个错误!
1.自己封装的工具类,单独代码调试时一切正常;
2.使用idea工具进行jar打包
3.在其他项目引入该工具类jar包,并调用其方法进行本地调试时,会输出NoClassDefFoundError、ClassNotFoundException等错误。
网上有很多springboot和maven引入第三方包或者本地包的教程,这里不再赘述,大家自行参考即可,本文主要记录问题定位及解决思路。
最开始,以为是springboot中引入包的方式或者其他依赖注入等操作的姿势不正确导致的问题,因此先选择剥离springboot,避免springboot对问题的干扰。
解决方法:
通过新建一个简单的maven项目,引入自己封装的jar包来调用测试。
测试结果:
仍然提示同样的错误。
测试结论:
该错误与springboot无关。
此时测试项目中只有maven,需要排除是否是maven引入本地jar包的方式不对。
解决方法:
新建空的java项目,并新建lib文件夹,手动复制放入自己封装的jar包,并引入项目中。
测试结果:
仍然提示错误。
测试结论:
与maven无关,最终定位问题在于jar包本身打包的问题上。
最终问题很有可能因为自己打包的某个设置出错了。
解决方法:
重新学习如何用idea操作jar打包,并明确每个设置的含义。
此处推荐idea打包java可执行jar包,文章对每个设置内容都进行了详细的讲解和说明。但因为自己学习的时候不够细心,跳过了某个默认值的设置,最终为本文的错误埋下了伏笔。
测试结果:
利用java -jar指令执行jar包时,提示了“没有主清单属性”的错误。
测试结论:
在指定main class或者META-INF的时候出现错误了。
到这一步,通过上一步骤的问题提示及资料查阅,基本上断定是META-INF出问题了,打开jar包查看发现MANIFEST.MF中并没有指定main class。
再次回顾打包步骤的META-INF设置,注意蓝色方框内的问题,我就是使用了默认位置,导致该文件出现错误,才导致了后续一系列的问题。
测试方法:
修改meta-inf的生成路径。
测试结果:
引入工具包,成功运行。
测试结论:
使用idea的默认meta-inf的生成路径,在我电脑上会导致jar包打包的错误。具体原因还需要进一步查阅资料核实。
要修改idea中默认的META-INF的生成路径,确保生成的包可用。