Maven命令行构建失败Eclipse成功,运行Jar遇Null及NoSuchMethodError
Maven项目Eclipse构建成功但命令行执行Jar报错的解决方案
一、java -jar命令的正确性说明
java -jar命令本身是正确的,但必须满足两个前提:
- Maven打包时已在
pom.xml中指定主类,示例配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.yourpackage.YourMainClass</mainClass> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin> - 依赖需正确处理:要么用
maven-shade-plugin把所有依赖打包进Jar,要么把依赖放在Jar同目录的lib文件夹下(配合上述addClasspath配置)。
二、解决NoSuchMethodError(依赖兼容问题)
这个错误源于Selenium 3.141.59、Guava 25.0-jre和Java 17的版本冲突:
- Guava 25.0-jre是2018年的版本,不支持Java 17的模块化特性,部分方法签名在高版本Java中已变更,导致方法找不到。
- 修复步骤:
- 在
pom.xml中明确指定支持Java 17的Guava版本(比如31.1-jre,适配Selenium 3.141.59):<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency> - 排除Selenium自带的低版本Guava依赖,避免冲突:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> - 执行
mvn clean install重新构建,确保依赖更新生效。
- 在
三、解决this.driver空指针问题
空指针的核心是驱动初始化失败,常见场景及修复:
- 命令行未配置驱动路径:Eclipse中可能通过运行配置设置了
webdriver.chrome.driver等系统属性,但命令行运行时未传递。解决方法:
运行Jar时添加系统参数:
或者用java -Dwebdriver.chrome.driver=/path/to/chromedriver.exe -jar your-jar-file.jarWebDriverManager自动管理驱动(推荐):
添加依赖到pom.xml:
代码中初始化驱动:<dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>5.3.3</version> </dependency>WebDriverManager.chromedriver().setup(); this.driver = new ChromeDriver(); - Jar打包未包含驱动文件:如果驱动文件放在项目资源目录,需确保Maven打包时包含:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <configuration> <includeEmptyDirs>true</includeEmptyDirs> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> </resource> </resources> </configuration> </plugin> - 工作目录不一致:命令行运行时的工作目录和Eclipse不同,导致相对路径读取驱动失败。解决方法:改用绝对路径,或通过
Class.getResourceAsStream()读取资源文件。
四、命令行构建运行验证步骤
- 执行
mvn clean package确保构建无报错; - 进入Jar所在目录,按要求添加参数后运行
java -jar your-jar-file.jar; - 若仍报错,查看完整堆栈信息,定位具体类或方法的冲突点。
内容的提问来源于stack exchange,提问作者Monita Shinkar
相关产品推荐
相关产品推荐

