簡體   English   中英

字節好友 - 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 引導應用程序 - 我在嘗試訪問任何 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')

我理解它是因為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。

是否有任何可能的解決方法或修復方法來解決這種情況? 感謝您的寶貴時間和反饋。

理想情況下,您的代理不包含此類。 相反,通過名稱匹配類: takesArgument(0, named("javax.servlet.ServletRequest"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM