我按照以下步驟向我的 JavaFX 專案添加了一個庫:
- 檔案 --> 專案結構 --> 專案設定 --> 庫 --> --> Maven
- 插入 Maven 坐標并選中“下載到 projectPath/libs”
- 在 pom.xml 中添加了正確的依賴宣告
- 在 module-info.java 中添加了“需要模塊”
將庫匯入我的班級似乎可行,但是在從庫中呼叫方法后,它會導致
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;}
uj5u.com熱心網友回復:
從評論中,您似乎正在使用一些不太常見的庫。有時,這些型別的庫沒有更新為與Java 平臺模塊系統兼容。我認為可以安全地假設,除非您不知道。
定義非模塊化專案
處理此類依賴項的最簡單方法是使您的專案非模塊化:洗掉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 存盤庫中獲取 JavaFX 模塊或從 Gluon 手動下載模塊和 SDK 來完成此操作。在所有構建和執行步驟中,您需要確保所有這些模塊都在模塊路徑上,并通過 VM 引數或module-info.java.
使用 Maven 構建
對于 Maven 構建,您需要將每個模塊單獨添加到模塊路徑中,因為它們都位于本地.m2存盤庫中的單獨目錄中(現代 Maven 系統和一些 IDE,例如 Idea,會自動執行此操作,其他 IDE,例如 VSCode不得)。
使用 SDK 構建
或者,不要通過 Maven 添加對 JavaFX 模塊的依賴項。相反,下載 JavaFX SDK 并通過 VM 引數--module-path和--add-modules. 將 JavaFX 模塊添加到 OpenJDK 的程序記錄在 openjfx.io 的入門檔案中。
關于 openjfx.io Maven 原型的注釋
請注意,圍繞此的 openjfx.io 入門檔案提到了 maven 原型。我的建議是不要使用它們,因為如果您嘗試從 IDE 中使用它們,它們真的很難使用。相反,請使用 Idea new JavaFX 專案向導,保留它為模塊化專案生成的 module-info.java 或洗掉它并為非模塊化專案手動指定 JavaFX 模塊 VM 引數。
專案構建的問題
就您的實際專案而言,我遇到了 duffymo 在評論中指出的相同錯誤:
我無法從 Maven Central 解決 web3jm-evm 的所有依賴項。它從 org.hyperledger.besu 中提取了一堆不在 Maven Central 中的 JAR。
所以我無法構建或測驗它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/445985.html
