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

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

我正在尝试检测 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"
                                )
                )

现在,如果我通过 agentmain 将此代理附加到已经 运行 Spring 的启动应用程序 - 我在尝试访问任何网页时看到以下异常

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')

我理解它是因为 javax/servlet/http/HttpServletRequest 实例是从 2 个不同的 jar 加载的 - 一个通过代理加载,另一个通过 spring 引导嵌入 tomcat。如果我尝试在代理的 pom.xml 中将范围设置为 provided [ 因为我不想在代理捆绑的 jar 中包含 servlet-api 并尝试使用已经提供的 servlet-api从 Spring boot 实现],我得到 Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletRequest - 可能是因为加载代理的类加载器看不到 spring boot 提供的 servlet api.

是否有任何可能的解决方法或修复方法来解决这种情况?感谢您的宝贵时间和反馈。

理想情况下,您的代理不包含此类 类。相反,通过他们的名字匹配 类:例如 takesArgument(0, named("javax.servlet.ServletRequest"))