我面临着一个非常奇怪的问题,这个问题发生在下面的远程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之后,错误仍然存在。
顺便说一下,jar包括由system类型导入的警告类。jars放在资源/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 when the method definitely exists我不知道如何解决这个问题,任何人都可以帮助我吗?
发布于 2022-11-10 09:30:31
我回来解决了。我太粗心了。根本原因确实是从另一个jar加载的getSymbolFactory方法,我只验证了SqlParser类,缺少了从父类java_cup.runtime.lr_parser继承的getSymbolFactory方法。关键是这个类是从另一个jar加载的,我没有注意到。
它在本地机器上工作良好的原因是方法是从正确的jar加载的。我正在使用tomcat 8,我已经搜索了tomcat的加载机制。结果表明,tomcat 8的装载顺序没有得到保证。在这里,尽管这是一个基本问题,但我想总结一下故障排除时的情况。
Configure Tomcat to Log all Jar Files and/or Classes Loaded at Startup
我用这个
-XX:+TraceClassLoading的jar。
grep "xxx" web-inf/lib/jars类的签名
javap -classpath jar com.xxx.xxx相关的文章
Order of loading jar files from lib directory
https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
how tomcat will load the class if duplicate classes exist with same package structure
希望这些能帮助到其他人。
发布于 2022-11-09 15:08:00
NoSuchMethodError意味着您使用Apache的一个版本编译了代码/war,但是服务器上有不同的版本(或者可能还没有安装)。解决方案是将服务器上的Doris库升级到本地使用的库。
https://stackoverflow.com/questions/74377007
复制相似问题