我添加了library按照以下步骤添加到我的 JavaFX 项目:
- 文件 --> 项目结构 --> 项目设置 --> 库 --> + --> Maven
- 插入 Maven 坐标并选中“下载到projectPath/libs”
- 在 pom.xml 中添加了正确的依赖声明
- 在 module-info.java 中添加了“requires module”
将库导入到我的类中似乎可行,但是从库中调用方法后,会产生
Caused by: java.lang.ClassNotFoundException: org.web3j.utils.Numeric
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
现在,我最初认为是一个库问题,但是在正常的 Maven 项目中重现相同的步骤(并尝试运行相同的代码片段)效果很好。
有什么想法为什么会发生这种情况吗?我在导入库时做错了什么吗?
HELLOAPPLICATION.JAVA
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load() , 320 , 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
Web3j web3j = Web3j.build(new HttpService("http://127.0.0.1:8545"));
web3j.ethGetBlockByNumber(DefaultBlockParameter.valueOf(new BigInteger("14000000")), true);
}
public static void main(String[] args) {
launch();
}
}
编辑:
POM.XML
<?xml version="1.0" encoding="UTF-8"?>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>demo</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>5.8.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>17.0.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>web3j-evm</artifactId>
<version>4.9.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<executions>
<execution>
<!-- Default configuration for running with: mvn clean javafx:run -->
<id>default-cli</id>
<configuration>
<mainClass>com.example.demo/com.example.demo.HelloApplication</mainClass>
<launcher>app</launcher>
<jlinkZipName>app</jlinkZipName>
<jlinkImageName>app</jlinkImageName>
<noManPages>true</noManPages>
<stripDebug>true</stripDebug>
<noHeaderFiles>true</noHeaderFiles>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
模块信息.JAVA
module com.example.demo {
requires javafx.controls;
requires javafx.fxml;
requires core;
opens com.example.demo to javafx.fxml;
exports com.example.demo;}
最佳答案
从评论来看,您似乎使用了一些不太常见的库。有时,这些类型的库不会更新以与 Java Platform Module System 兼容。 。我认为除非您另有了解,否则可以安全地进行假设。
定义非模块化项目
处理此类依赖关系的最简单方法是使您的项目成为非模块化的:删除module-info.java
。
但 JavaFX 本身仅作为模块受支持。因此,即使您的项目及其依赖项是非模块化的,您仍然应该将 JavaFX 库放在模块路径上。
使用包含 JavaFX 的 JDK
要完成这样的设置(使用 JavaFX 模块的非模块化应用程序),最简单的方法是依赖包含 JavaFX 模块的 JDK 或 JRE,例如 Zulu JDK FX分布或 Liberica Full JDK分配。 使用正确的发行版非常重要,因为 Zulu 和 Liberica 的基本 JDK 发行版不包含 JavaFX。
使用不包含 JavaFX 的基本 JDK
再做一点工作,您就可以使用 OpenJDK。您可以通过从 maven repository with a build tool 获取 JavaFX 模块来完成此操作。 ,或 manual download of the modules and SDK from Gluon 。在所有构建和执行步骤中,您需要确保所有这些模块都位于模块路径上,并通过 VM 参数或 module-info.java
向模块系统声明。
使用 Maven 构建
对于 Maven 构建,您需要将每个模块单独添加到模块路径中,因为它们都位于本地 .m2
存储库中的单独目录中(现代 Maven 系统和一些 IDE,例如Idea,会自动执行此操作,其他 IDE(例如 VSCode)可能不会)。
使用 SDK 构建
或者,不要通过 Maven 添加对 JavaFX 模块的依赖项。相反,下载 JavaFX SDK 并通过 VM 参数 --module-path
和 --add-modules
添加 JavaFX 模块。将 JavaFX 模块添加到 OpenJDK 的过程记录在 getting started documentation at openjfx.io 中。 .
关于 openjfx.io Maven 原型(prototype)的注释
请注意,openjfx.io 入门文档中提到了 Maven 原型(prototype)。我的建议是不要使用它们,因为如果您尝试从 IDE 使用它们,它们确实很难使用。相反,请使用想法 new JavaFX project wizard ,要么保留它为模块化项目生成的 module-info.java,要么删除它并为非模块化项目手动指定 JavaFX 模块 VM 参数。
项目构建问题
就您的实际项目而言,我遇到了duffymo在评论中指出的相同错误:
I can't resolve all the dependencies for web3jm-evm from Maven Central. It's pulling in a bunch of JARs from org.hyperledger.besu that aren't in Maven Central.
所以我无法构建或测试它。
关于java - Intellij 2021.3.2,JavaFX Maven 项目未正确解析依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71526616/