tomcat9 - Tomcat 服务未使用弹性 APM java 代理启动
问题描述
我正在尝试使用弹性 APM 代理(java)在 linux 中启动 tomcat 服务。但是每次我启动服务时,都会出现这些错误
SEVERE: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mis-all-1.0.0]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1007)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:983)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:639)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1296)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2037)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.VerifyError: (class: javax/servlet/GenericServlet, method: init signature: (Ljavax/servlet/ServletConfig;)V) invokedynamic bytecode is not supported in this class file version
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2509)
at java.lang.Class.getDeclaredFields(Class.java:1819)
at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106)
at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:270)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:138)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:70)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:417)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:891)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:388)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5536)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 10 more
May 20, 2021 5:48:15 AM org.apache.catalina.startup.HostConfig deployDirectory
SEVERE: Error deploying web application directory []
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mis-all-1.0.0]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1011)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:983)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:639)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1296)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2037)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
at java.lang.Thread.run(Thread.java:745)
我正在使用以下命令为 APM 代理设置环境变量
export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/app/elastic-apm-agent-1.23.0.jar"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.service_name=Stage-pricing"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.application_packages=org,com,com.qr.jadu"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.server_url=http://ip:8200"
export CATALINA_OPTS="$CATALINA_OPTS -Delastic.apm.global_labels='env=Stage'"
和 logback-classic 版本 1.0.6
请提出解决方案或我缺少的任何步骤,在此先感谢。
kriegaex更新,从 OP 的评论中复制:
- 服务器版本:Apache Tomcat/7.0.106 服务器
- 建成时间:2020 年 9 月 16 日 08:33:41 UTC
- 服务器号:7.0.106.0 操作系统
- 操作系统:Linux 操作系统版本:4.14.35-2047.502.4.1.el7uek.x86_64
- 架构:amd64
- JVM版本:1.7.0_301-b09
- JVM 供应商:Oracle Corporation APM
- 服务器版本:7.12.1
- APM 代理语言和版本:java, 1.23。apm 代理还支持 7u60+、8u40+、9、10、11。
解决方案
Caused by: java.lang.VerifyError: ( class: javax/servlet/GenericServlet, method: init signature: (Ljavax/servlet/ServletConfig;)V) invokedynamic bytecode is not supported in this class file version
彼得是对的。您的 Elastic APM 代理 - 无论做什么 -void GenericServlet.init(ServletConfig)
以利用invokedynamic
字节码指令的方式转换字节码,而不是检查或期望它编织成的代码来自古老的 Java 版本。Invokedynamic 是在 Java 7 中引入的,因此您的 JAR 必须包含旧版本。如果可以通过这种方式配置代理,则将其从转换中排除,或者升级 JAR,使用更新的版本或将 API 源重新编译到更新的 (Java 7+) 字节码版本。大多数代理可能更期待 Java 8+,但我不确定你的。
推荐阅读
- python - 使用Python-IVI编程数字万用表时出现的问题
- javascript - 鼠标按下时的矢量吸引力
- javascript - 如何在浏览器扩展中动态附加内容脚本。?
- python - IndexError: 只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效的索引,我该如何解决?
- jenkins - Jenkins 自动在 PATH 前面加上 java 和 ant 的路径。如何禁用?
- data-science - 线性回归表
- c# - 如何从文件/ url c#中读取值
- javascript - 如何在 localhost 上同时运行前端和后端
- javascript - 无需打开页面即可打印另一页,只需使用打印窗口
- c# - .Skip().Take() 之后的 ToList 调用太慢