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