简体   繁体   English

字节好友 - java.lang.NoClassDefFoundError: javax/servlet/ServletRequest

[英]Byte Buddy - java.lang.NoClassDefFoundError: javax/servlet/ServletRequest

I am trying to instrument service method of javax.servlet.Servlet interface implementations as following:我正在尝试检测javax.servlet.Servlet接口实现的service方法,如下所示:

.transform(
                        new AgentBuilder.Transformer.ForAdvice()
                                .include(MyAgent.class.getClassLoader())
                                .advice(
                                        named("service")
                                                .and(takesArgument(0, ServletRequest.class))
                                                .and(takesArgument(1, ServletResponse.class))
                                        , "com.MyAdvice"
                                )
                )

Now, if I attach this agent to an already running Spring boot application via agentmain - I see below exception on trying to access any web page现在,如果我通过agentmain将此代理附加到已经运行的 Spring 引导应用程序 - 我在尝试访问任何 web 页面时看到以下异常

java.lang.LinkageError: loader constraint violation: when resolving method 'void javax.servlet.http.HttpServletRequestWrapper.<init>(javax.servlet.http.HttpServletRequest)' 
the class loader org.springframework.boot.loader.LaunchedURLClassLoader @18be83e4 of the current class,
org/springframework/web/servlet/resource/ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper, and the class loader 'app' for the method's defining class, javax/servlet/http/HttpServletRequestWrapper, 
have different Class objects for the type javax/servlet/http/HttpServletRequest used in the signature (org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper is in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @18be83e4, parent loader 'app'; javax.servlet.http.HttpServletRequestWrapper is in unnamed module of loader 'app')

I understand its because javax/servlet/http/HttpServletRequest instance is loaded from 2 different jars - one that came through agent and another through spring boot embedded tomcat. If I try to set scope as provided in agent's pom.xml [ since I do not want to include servlet-api in agent bundled jar and try use already provided servlet-api implementation from Spring boot ], I get Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletRequest - possibly because the classloader loading the agent can't see spring boot provided servlet api.我理解它是因为javax/servlet/http/HttpServletRequest实例是从 2 个不同的 jars 加载的 - 一个通过代理加载,另一个通过 spring 引导嵌入 tomcat。如果我尝试设置 scope,如代理的pom.xml do not388 中provided的那样 [ 因为我想要在代理捆绑 jar 中包含 servlet-api 并尝试使用已经提供的 servlet-api 实现从 Spring 启动],我得到Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletRequest - 可能是因为加载代理的类加载器不能'看不到 spring 启动提供的 servlet api。

Is there any possible workaround or fix to resolve this situation?是否有任何可能的解决方法或修复方法来解决这种情况? Thank you for your time and feedback.感谢您的宝贵时间和反馈。

Ideally, your agent does not contain such classes.理想情况下,您的代理不包含此类。 Rather, match classes by their name: takesArgument(0, named("javax.servlet.ServletRequest")) , for instance.相反,通过名称匹配类: takesArgument(0, named("javax.servlet.ServletRequest"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.NoClassDefFoundError: javax/servlet/ServletContext - java.lang.NoClassDefFoundError: javax/servlet/ServletContext Java Spring MVC - java.lang.NoClassDefFoundError:javax / servlet / ServletContext - Java Spring MVC - java.lang.NoClassDefFoundError: javax/servlet/ServletContext javax.servlet.ServletException:java.lang.NoClassDefFoundError:JspException - javax.servlet.ServletException: java.lang.NoClassDefFoundError: JspException 泽西Servlet-java.lang.NoClassDefFoundError:javax / xml / bind / JAXBException - Jersey Servlet - java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException java.lang.NoClassDefFoundError:javax / servlet / http / HttpSessionBindingListener - java.lang.NoClassDefFoundError: javax/servlet/http/HttpSessionBindingListener 没有找到 java.lang.NoClassDefFoundError 类:javax/servlet/SessionCookieConfig - Does not find the java.lang.NoClassDefFoundError class: javax / servlet / SessionCookieConfig 将jetty 7更新为jetty 8:java.lang.NoClassDefFoundError:javax / servlet / FilterRegistration - Updating jetty 7 to jetty 8 : java.lang.NoClassDefFoundError: javax/servlet/FilterRegistration @Controller导致java.lang.NoClassDefFoundError:javax / servlet / http / HttpServletRequest - @Controller causing java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest SpringMVC-java.lang.NoClassDefFoundError:javax / servlet / ServletContext - SpringMVC - java.lang.NoClassDefFoundError: javax/servlet/ServletContext Swagger 与 Jersey 2 抛出 java.lang.NoClassDefFoundError: javax/servlet/ServletConfig - Swagger with Jersey 2 throws java.lang.NoClassDefFoundError: javax/servlet/ServletConfig
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM