在新环境的tomcat上部署程序时发现程序启动异常,访问404,启动日志卡住没有下文了,如下:
这个问题困扰了一整天,最后终于解决了,下面是一系列的排查流程以及解决方案供大家参考:
通过网络资料查询到一些解决方案:
解决方案一:
找到jdk1.x.x_xx/jre/lib/security/Java.security文件,在文件中找到securerandom.source这个设置项,将其改为:
securerandom.source=file:/dev/./urandom。
此办法对我不生效,so解决方案二:
因考虑是否是内存不足导致程序无法正常启动,在启动命令中去掉与内存相关的命令,如:
--server -Xms1024m -Xmx1024m
如果在catalina.bat文件中设置了内存机制, 如:set JAVA_OPTS=-server -Xms1024m -Xmx1024m ,用rem 注释掉,或删除 。
另外这种情况还有可能时数据库初始化失败导致的,查看数据库连接是否正常,数据库配置是否有误:由于我数据库账密做过加密处理,所以我服务器上配置的密码容易出错,果然再次加密后和现在的配置不一样,修改后重启。
重启后惊呆了,一顿操作和没修改前一样的,没有一点效果。。。也许我还有其他问题需要处理,再次观察启动日志:
从这三行可以发现一个或多个监听启动失败,服务程序启动失败,但没有详细原因,到服务目录里的log4j中查看日志:
很明显的一个报错信息,在服务器找不到ifconfig命令导致程序失败,回到服务器安装ifconfig
sudo apt install net-tools
安装完成后再次启动,又出现一个新的报错Caused by: java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY。。。简直是困难重重
Caused by: java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY
at org.apache.logging.log4j.core.config.ConfigurationSource.<clinit>(ConfigurationSource.java:56)
at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32)
at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:85)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:254)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:140)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:123)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:230)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:174)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:648)
at net.bull.javamelody.internal.common.Log4J2Logger.<clinit>(Log4J2Logger.java:30)
at net.bull.javamelody.internal.common.LOG.getJavaMelodyLogger(LOG.java:183)
at net.bull.javamelody.internal.common.LOG.<clinit>(LOG.java:42)
at net.bull.javamelody.MonitoringSpringInterceptor.<init>(MonitoringSpringInterceptor.java:54)
at net.bull.javamelody.MonitoringSpringAdvisor.<init>(MonitoringSpringAdvisor.java:36)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
... 67 more
这个错误来源于log4j,出现该问题的原因是:
Apache Log4j2出现了“核弹级”漏洞,其中针对jdk8以上的修复方案常见为,将log4j-core升级为2.15.0版本; 升级后应用出现:java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY报错。
有可能是版本过低需要升级导致(网络查阅升级到log4j-api-2.12.4.jar、log4j-core-2.17.4.jar即可解决),还有可能是jar包冲突导致,需确认有没有不同版本的同一个jar包。
查看我的服务lib目录下有两个版本的jar包
删除掉log4j-api-2.12.0.jar、log4j-core-2.17.0.jar,再次重启,程序正常启动,请求不在404,问题解决。