我在遠程tomcat服務器上遇到了一個非常奇怪的問題,但在本地運行良好。
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.doris.analysis.SqlParser.getSymbolFactory()Ljava_cup/runtime/SymbolFactory;
我知道關于這個問題的大多數相關主題是包重復、依賴沖突等。但實際上,我已經嘗試消除這些因素。本地和遠程的戰爭是相同的。我還反編譯了包含SqlParser類的jar,它確實存在并且包含getSymbolFactory函式。
最奇怪的是,當我將其復制到本地運行時,它就可以了。起初,我懷疑是關于 tomcat 的版本。但是在遠程使用相同版本的Tomcat后,錯誤依然存在。
順便說一句,jar 包含由系統 jar 型別匯入的警告類。罐子被放置在 resource/lib/* 。跟這個有關嗎?
用于匯入系統 jar 的 Maven 配置
<dependency>
<groupId>net.sourceforge.czt.dev</groupId>
<artifactId>java-cup</artifactId>
<version>0.11-a-czt02-cdh</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/java-cup-runtime-0.11-a-czt01-cdh.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.doris</groupId>
<artifactId>fe-core</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/fe-core-1.0-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.doris</groupId>
<artifactId>fe-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/fe-common-1.0-SNAPSHOT.jar</systemPath>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>ftl</nonFilteredFileExtension>
</nonFilteredFileExtensions>
<outputDirectory>target</outputDirectory>
<webResources>
<resource>
<filtering>true</filtering>
<directory>src/main/webapp/WEB-INF</directory>
<includes>
<include>**/*.xml</include>
</includes>
<targetPath>/WEB-INF</targetPath>
</resource>
<resource>
<directory>src/main/resources/lib</directory>
<targetPath>WEB-INF/lib</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
目前,我找到的最相關的執行緒是: java.lang.NoSuchMethodError 當方法肯定存在時 我不知道如何解決這個問題,任何人都可以幫助我嗎?
uj5u.com熱心網友回復:
ANoSuchMethodError表示您使用一個版本的 Apache Doris 編譯了您的代碼/戰爭,但您在服務器上有一個不同的版本(或者可能沒有安裝它)。解決方案是將服務器上的 Doris 庫升級到本地使用的庫。
uj5u.com熱心網友回復:
我回來解決了。那是我很粗心。根本原因確實是從另一個 jar 加載的 getSymbolFactory 方法,我只驗證了 SqlParser 類,并且缺少驗證從父類 java_cup.runtime.lr_parser 繼承的 getSymbolFactory 方法。關鍵是這個類是從另一個 jar 加載的,我沒有注意到。
為什么它在本地機器上運行良好的原因是該方法是從正確的 jar 加載的。我用的是tomcat 8,我搜索過tomcat的加載機制。事實證明,不能保證tomcat 8的加載順序。在這里,盡管這是一個基本問題,但我想總結一下我排錯時的事情。
- 打開加載 jar 日志并查看 Catalina.out
配置 Tomcat 以記錄啟動時加載的所有 Jar 檔案和/或類
我用這個
-XX: TraceClassLoading
- 找到包含指定類或方法的jar
grep "xxx" web-inf/lib/jars
- 檢查類的簽名
javap -classpath jar com.xxx.xxx
- 一些tomcat加載相關的帖子
從 lib 目錄加載 jar 檔案的順序
https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
如果存在具有相同包結構的重復類,tomcat將如何加載該類
希望這些可以幫助其他人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/532718.html
標籤:爪哇行家网络雄猫战争
下一篇:“sh-c”有什么作用?
