最近我在公司负责古董项目的升级改造。我写了一个用上了RSA加密的登录功能,功能中使用到了apache的common-codec
包中的Base64,写完部署调试后,出现了org.apache.commons.codec.binary.Base64
类的NoSuchMethodError
。
于是,我使用了Maven Helper
的依赖图以及 mvn dependency:tree
等方式,将common-codec
包去重留下最新的版本并重新部署到测试环境。然而上述问题并没有得到解决。
好在,运气不错。我在Stack Overflow
那里找到了思路,经过一番折腾后,最终把问题解决了。以下是解决过程。
问题解决分析过程
1、思路来源
https://stackoverflow.com/questions/35186/how-do-i-fix-a-nosuchmethoderror
2、原因分析
- 上述报错图中我们可以看到报的是
NoSuchMethodError
,既然能通过编译,那必然是发生了多个类被引用的冲突。 - 上述已通过
Maven Helper
的依赖图以及mvn dependency:tree
将版本问题排除了,那么就剩下的是不同jar包的同类路径冲突了。
3、解决思路
要找出org.apache.commons.codec.binary.Base64
类实际加载自哪个jar包,我们可以通过java -verbose:class <other args>
来输出JVM
类加载过程来进行查询判断。
4、解决过程
1、修改catalina.bat
,增加-verbose
参数
2、修改catalina.bat
,使tomcat控制台输出内容全部输出到一个文件中
于catalina.bat
文件的末尾,在java的执行语句末尾均加上
>> %CATALINA_BASE%\logs\catalina.out
3、运行catalina.bat start
命令,运行tomcat,当tomcat完全运行后,关闭tomcat。打开输出文件,搜索冲突的类,即可找到冲突的jar包,然后在pom.xml
中排除掉即可
同理,在linux中,根据
shell
的语法去修改catalina.sh
即可。