我是 Maven 和 Gradle 的新手,我正在嘗試將 MongoDB 依賴項添加到我的 JavaFx 應用程式中。問題是即使我添加了對 build.gradle/pom 的依賴并單擊加載更改,IntelliJ 也找不到該類。我嘗試了很多方法,例如使快取無效、全部洗掉并重新創建專案,但它仍然無法正常作業。謝謝。


uj5u.com熱心網友回復:
關于向模塊化專案添加依賴項的建議
一些(固執的)建議:
不要匯入你不使用的庫:
- 例如controlsfx/formsfx/validatorfx/ikonli/bootstrapfx/tilesfx。
如果您不了解 Gradle 或 Maven,請在使用idea new JavaFX 專案向導時選擇 Maven 。
- 對于一個簡單的專案,Maven 可能更容易學習和理解。
如果在添加 mongo 等 3rd 方依賴項時您的專案是模塊化的,您還需要將
module-info.java檔案更新require為新模塊。- 默認情況下,Idea new JavaFX 專案向導將創建一個
module-info.java使您的專案模塊化的檔案。
- 默認情況下,Idea new JavaFX 專案向導將創建一個
要確定所需模塊的模塊名稱,您可以檢查庫在其源存盤庫或二進制 jar 中是否有模塊資訊并使用它。
如果沒有模塊資訊,在這種情況下,它將是一個自動模塊。
如果它是一個自動模塊,您可以從
Automatic-Module-Namejar 中的清單標頭中找到模塊名稱(如果已定義)。如果沒有定義manifest header,可以根據鏈接的自動模塊檔案中的步驟,從jar名中找出模塊名。
您可能需要在模塊資訊中添加其他陳述句,例如
opensorexports子句。- 您會知道這一點,因為您在嘗試使用依賴模塊中的代碼時會收到運行時錯誤。這些運行時錯誤將通知您由于 Java 模塊系統的限制而出現訪問錯誤。
即使您執行了上述所有操作,某些庫也可能無法作為 Java 平臺模塊作業,因為它們沒有被編碼為作業。在這種情況下,您應該從類路徑中運行它們的庫。在這種情況下,最好使您的專案非模塊化(同時將 JavaFX 庫作為模塊保留在模塊路徑上)。為此,請洗掉該module-info.java檔案并使用 VM 引數來允許訪問 JavaFX 模塊。有關此類配置的更多資訊,請研究有關非模塊化專案的檔案,例如 openjfx.io,特別是使用 Maven 的非模塊化部分。但是,只有在您失敗或讓專案作為模塊化專案作業太不方便時才這樣做。
如果您不理解上述步驟中的資訊,請學習以下兩個教程:
- 您選擇的構建系統。
- Java 模塊系統。
- 如何調整您的專案以使用 Java 模塊系統。
- 如何使用您的構建系統來處理 Java 模塊系統。
如果這很困難(并且可能),您可以聯系第三方庫的供應商并請求幫助以使該庫作為 Java 平臺模塊作業。
專門針對 MongoDB
我確實使用 MongoDB java 客戶端庫嘗試了上述步驟。這樣做之后,我得出的結論是,最好(當前)以非模塊化模式(即,module-info.java在您的專案中未定義)將 JavaFX 中的 MongoDB 與您的專案一起使用。
這是因為從 MongoDB 4.5.1 開始:
MongoDB 只能用作自動模塊,因為它不提供適當的模塊資訊。
MongoDB 客戶端位于多個 jar 中,并將其包定義拆分到多個 jar 中。
- 據我所知,這種跨多個 jar 的拆分包定義是 Java 平臺模塊系統不允許的配置。
- 包在和
com.mongodb中都定義了類。mongodb-driver.jarmongodb-driver-core.jar
這是 mongodb JavaFX 的非模塊化設定
所有檔案均由 Idea New JavaFX 專案向導生成,并進行了如下所述的一些修改(未列出未修改的檔案)。
我不使用 MongoDB,也沒有 MongoDB 服務器設定,所以我只是驗證了以下配置編譯并嘗試連接到服務器(然后由于沒有服務器運行而無法連接)。
為了簡化設定,在向導定義期間,我選擇了 JDK:“liberica-18 BellSoft Liberica version 18”。這是 Liberica 的“完整 JDK”版本,在其基本 JDK 發行版中包含 JavaFX 模塊,因此我不需要定義命令列開關來在編譯和運行時啟用 JavaFX(這是一個痛苦且容易出錯的程序)。
默認情況下,MongoDB java 客戶端不附帶日志實作。要從客戶端獲取日志,您需要包含日志記錄實作依賴項。對于這個例子,我選擇包含 slf4j-simple 作為日志實作,如果你愿意,你可以用另一個兼容的庫替換它。
MongoDB 客戶端訪問代碼是從MongoDB 快速入門教程中復制的,但它使用的是本地訪問 URL,而不是集群服務 URL,而不是 Atlas 云托管的 MongoDB 實體。
模塊資訊.java
檔案已洗掉。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>mongodb-javafx-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>mongo</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javafx.version>18</javafx.version>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.9.0</version>
<configuration>
<source>18</source>
<target>18</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
HelloApplication.java
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.bson.Document;
import java.io.IOException;
import static com.mongodb.client.model.Filters.eq;
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();
// Replace the uri string with your MongoDB deployment's connection string
String uri = "mongodb://localhost:27017";
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("sample_mflix");
MongoCollection<Document> collection = database.getCollection("movies");
Document doc = collection.find(eq("title", "Back to the Future")).first();
System.out.println(doc.toJson());
}
}
public static void main(String[] args) {
launch();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/459803.html
