Java/Selenium应用命令行执行类路径搜索顺序异常问题
命令行运行Java/Selenium应用遭遇NoClassDefFoundError问题
基础环境
- Windows 10 命令行环境
- Java 17
- 未使用Maven,手动管理Selenium及依赖包
- Selenium版本:4.16.1
初始目录结构
Selenium(包含SeleniumTest1.java) | - classes(存放所有selenium-java-4.16.1的jar包) | - auxClasses(存放failsafe-3.3.2.jar、google-collections-1.0.jar、guava-17.0.jar)
编译操作(成功完成)
执行编译命令:
C:\Selenium>javac -cp .\classes\selenium-api-4.16.1.jar;.\classes\selenium-chrome-driver-4.16.1.jar;.\classes\selenium-chromium-driver-4.16.1.jar;.\classes\selenium-remote-driver-4.16.1.jar;.\classes\selenium-support-4.16.1.jar SeleniumTest1.java
首次运行报错
执行运行命令:
C:\Selenium>java -cp .;.\classes\*;.\auxClasses\* SeleniumTest1
得到错误栈片段:
... 7 more Caused by: java.lang.ClassNotFoundException: com.google.common.base.Throwables at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 9 more
排查发现:com.google.common.base.Throwables 类在auxClasses\guava-17.0.jar中的实际存储路径是spals\shaded\com\google\common\base\Throwables,与预期的包路径不匹配。
尝试修复后的目录结构
将guava-17.0.jar解压,移除spals\shaded前缀层级,让com成为根目录,把处理后的文件放入guava-17.0-extracted目录,更新后的结构:
Selenium(SeleniumTest1.java) | - classes(所有selenium-java-4.16.1的jar包) | - auxClasses(failsafe-3.3.2.jar、google-collections-1.0.jar、guava-17.0.jar) | - guava-17.0-extracted(根目录为com的文件结构)
修复后运行仍报错
执行更新类路径的运行命令:
C:\Selenium>java -cp .;.\classes\*;.\auxClasses\*;.\guava-17.0-extracted SeleniumTest1
得到新的错误栈片段:
... Caused by: java.lang.NoClassDefFoundError: spals/shaded/com/google/common/base/Throwables (wrong name: com/google/common/base/Throwables) at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:177) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:523) ... 7 more
疑惑:按逻辑,运行时应该从guava-17.0-extracted找到正确包路径的com.google.common.base.Throwables,同时auxClasses\guava-17.0.jar中的spals/shaded/com/google/common/base/Throwables也能被正常加载,但实际出现类名不匹配的错误,无法定位问题原因。
内容的提问来源于stack exchange,提问作者Gene
相关产品推荐
相关产品推荐

