我正在使用selenium和javaFX开发一些小程序。当我分别在一个项目和一个JavaFX项目上试用我的代码时,一切都很顺利。当我把代码放在一起并将所有依赖项导入maven,并试图运行时,它一直显示这个错误:
[ERROR] COMPILATION ERROR :[INFO] -------------------------------------------------------------[ERROR] module not found: processed.jcommander[ERROR] module not found: processed.async.http.client
我不知道这些模块是什么,它们不是依赖关系,也不在代码中使用。这些模块是什么,为什么会出现编译错误?
我的POM.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>DedoDoDida</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.7.1</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.projectlombok</groupId>-->
<!-- <artifactId>lombok</artifactId>-->
<!-- <version>1.18.6</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.google.code.gson</groupId>-->
<!-- <artifactId>gson</artifactId>-->
<!-- <version>2.10</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>20-ea+11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>20-ea+11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>19</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.6</version>
<executions>
<execution>
<!-- Default configuration for running -->
<!-- Usage: mvn clean javafx:run -->
<id>default-cli</id>
<configuration>
<mainClass>org.example.App</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我已经尝试在互联网上搜索,我已经在这个问题上停留了2天,我放弃了这个项目,但我决定尝试stackoverflow。可能是一些我解决不了的简单问题。
出现这种情况是因为您正在使用的用于Selenium软件的4.7.1
版本的Java平台模块定义(对我来说)被破坏了。
我正在使用您在应用程序中更新的pom.xml:
- javafx-maven-plugin的当前版本是0.0.8.
- 当前JavaFX的非早期访问(版本中没有-ea)是19.
和selenium文档中的hello world程序。
package dev.selenium.hello;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class HelloSelenium {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://selenium.dev");
driver.quit();
}
}
据我所知(我真的找不到关于这方面的文档),所以也许这甚至不支持,在模块化应用程序中使用Selenium,您需要在module-info.java
中使用以下模块。当我试图编译上面的程序时,这些是我的IDE建议的。
requires org.seleniumhq.selenium.api;
requires org.seleniumhq.selenium.chrome_driver;
一旦完成,随后的mvn:compile
给出了问题中的错误:
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] module not found: processed.jcommander
[ERROR] module not found: processed.async.http.client
这些模块不在selenium的传递依赖项中,因此selenium模块被破坏了。工件上有maven依赖项,因此您可以在maven引入的库依赖项中看到jcommander和async-http-client jar,但是这些jar不提供任何模块信息,因此它们的模块名称应该从jar文件名中派生为"自动模块"。这意味着它们将被module-info.java
引用为:
requires jcommander;
requires async.http.client;
但是它们没有使用这些名称来引用。
selenium-chrome-driver jar有:
module org.seleniumhq.selenium.chrome_driver {
...
requires org.seleniumhq.selenium.remote_driver;
...
}
selenium-remote-driver jar,有:
module org.seleniumhq.selenium.remote_driver {
...
requires processed.async.http.client;
requires processed.jcommander;
...
}
所以这些是错误的名称,具有processed.
前缀的模块不存在,所以如果您定义module-info.java
,则简单的HelloSelenium
应用程序不可用。
我现在唯一能建议的解决方法是通过not使你的应用程序非模块化定义module-info.java
(即删除module-info.java
文件,如果你的项目中有一个)。
但是,由于JavaFX需要位于模块路径上,因此您还需要:
- 使用包含JavaFX的JDK(例如"完整JDK")。(这是我推荐的选项)或
- 添加虚拟机选项来设置模块路径,并在编译和执行时添加JavaFX模块(在openjfix .io中指定)。
我还建议为selenium项目提交一个bug,以修复selenium-remote-driver jar中损坏的模块定义。
- 注意:我不知道硒项目的bug报告过程是如何工作的,所以我猜问题链接,它可能是这个错误的其他东西,但我的建议是尝试。 在提交bug报告时,你可以链接到这篇文章。
- 如果你提交了一个bug报告,请在这里通过编辑这个答案或发表评论来链接它。
由于其他答案没有提到这一点,我想把这个放在这里,4.6.0版本工作良好,没有给出类似的错误。如果您不需要从4.7引入的特定增强/错误修复。X,您可以使用4.6.0。我之前也在用4.7.2,但后来升级到4.6.0,它就像一个魅力。