1、现象描述
tomcat启动,控制台有异常信息,具体如下:
24-Oct-2023 09:28:59.128 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/hidata/tomcat8.5-db2-patrol/webapps/hijob-ansible.war 24-Oct-2023 09:29:01.251 SEVERE [localhost-startStop-1] org.apache.catalina.startup.ContextConfig.processAnnotationsJar Unable to process Jar entry [module-info.class] from Jar [file:/opt/hidata/tomcat8.5-db2-patrol/webapps/hijob-ansible/WEB-INF/lib/gson-2.8.6.jar] for annotations org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19 at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:97) at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:54) at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:174) at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:83) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2053) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2000) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1970) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1923) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1163) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:775) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5087) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1823) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
2、分析原因
异常日志中,比较关键的日志信息是这两句:
Invalid byte tag in constant pool: 19
org.apache.catalina.startup.ContextConfig.processAnnotationsJar Unable to process Jar entry [module-info.class] from Jar [file:/opt/hidata/tomcat8.5-db2-patrol/webapps/hijob-ansible/WEB-INF/lib/gson-2.8.6.jar] for annotations
项目中使用的tomcat版本是8.5版本,经过查询,发现异常信息是说 tomcat无法解析 gson-2.8.6.jar这个包,因为这个jar包里面使用到了jdk1.9的语法。
3、解决方案
有两种解决方案
- (1)将tomcat的版本升级到9
- (2)修改tomcat8.5版本的配置文件
(1)方案一 :将tomcat的版本升级到9
直接把tomcat8.5版本换成tomcat9版本即可,亲测有效。
细节:在启动Tomcat9时,控制台可能会出现IllegalArgumentException异常,即“AJP连接器配置secretRequired=“true”,但是属性secret确实空或者空字符串,这样的组合是无效的。”或者
The AJP Connector is configured with secretRequired="true" but the secret
原因是因为tomcat的配置文件server.xml里面,没有配置 secretRequired 这个属性,我们打开server.xml,tomcat9默认的配置是这样的
<Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" />
现在需要加上 secretRequired 这个属性。可以不用赋值,直接给个空字符串
<Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" secretRequired="" />
这样,再次启动就不会再报错了
(2)方案二 :修改tomcat8.5版本的配置文件
这个解决办法比较方便,不需要换tomcat,直接修改配置文件。
到tomcat的conf目录下,打开catalina.properties文件,找到 tomcat.util.scan.StandardJarScanFilter.jarsToSkip 这句话
然后,把我们刚刚报错的那个jar包,直接添加到后面就可以了。看日志是说gson-2.8.6.jar这个包,那我们就加他,
这个方式也同样可以解决这个异常