使用 MongoDB 驱动程序时的 java.lang.NoClassDefFoundError

Posted

技术标签:

【中文标题】使用 MongoDB 驱动程序时的 java.lang.NoClassDefFoundError【英文标题】:java.lang.NoClassDefFoundError when using MongoDB driver 【发布时间】:2017-06-26 14:18:20 【问题描述】:

我正在尝试使用 servlet 上的 Java 驱动程序连接到托管在 mlab 上的 MongoDB 数据库。

import org.bson.Document; 
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

public class MongoConnection 

    protected void connectToMongo(String loc)

        String dbName = "readings";
        String collection = "data";

        MongoClientURI uri = new MongoClientURI("mongodb://user:pass@ds143109.mlab.com:43109/readings");
        MongoClient client = new MongoClient(uri);
        MongoDatabase db = client.getDatabase(dbName);

        MongoCollection<Document> readings = db.getCollection(collection);

        Document doc = Document.parse(loc);

        readings.insertOne(doc);

        client.close();
    

问题是我收到以下错误: java.lang.NoClassDefFoundError: com/mongodb/MongoClientURI

我查看了一个答案 (How to resolve ClassNotFoundException: com.mongodb.connection.BufferProvider?),它向我强调我需要其他 jar,我已经下载了它们,但是我仍然收到此错误。

我正在使用 Eclipse 并将三个 jars 添加到构建路径中,通过右键单击项目然后跟随 Build Path -&gt; Configure build path -&gt; Java build path -&gt; libraries -&gt; add external JARs 在菜单中导航。

这是正确的做法吗?还有什么我应该做的吗?

【问题讨论】:

我在使用 IntelijIDEA 时遇到了 java.lang.NoClassDefFoundError: com/mongodb/client/MongoClients 的问题,通过编辑 Run/Debug configuration 解决了。 【参考方案1】:

你有java.lang.NoClassDefFoundError - 这意味着你的类在运行时丢失(而不是在构建/编译时)。所以你应该打开项目的“运行配置”对话框(项目上下文菜单->“运行方式”->“运行配置...”)并确保你有 bson-xxx.jar、mongodb-driver-xxx。 jar 和 mongodb-driver-core-xxx.jar 以某种方式列在 Classpath 选项卡中。是的,就像 Xavier Bouclet 所说的那样——如果你在应用程序服务器下运行它——这个 jars 应该被添加到你服务器的类路径中。

【讨论】:

每个驱动程序都列在“类路径选项卡”->“用户条目”->“MyProject(默认类路径”)下。然后我将 jars 添加到服务器类路径中,这解决了它。谢谢【参考方案2】:

如果您从 servlet 调用数据库,则必须确保将 mongodb jar 导出到服务器。

检查您如何在本地服务器上部署应用程序并确保 jars 在那里。

【讨论】:

【参考方案3】:

我的 Mule 4 项目遇到了类似的问题。

Failed to invoke lifecycle phase "initialise" on object:

那是指向:

java.lang.NoClassDefFoundError: com/mongodb/MongoClientURI

所以我必须在插件部分更新 POM 文件(mule-mave-plug,idk 在 java 项目中会是什么):

<sharedLibraries>
    <sharedLibrary>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver-legacy</artifactId>
    </sharedLibrary>
</sharedLibraries>

【讨论】:

以上是关于使用 MongoDB 驱动程序时的 java.lang.NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

使用 Audit.Net.MongoDB 时的问题

使用 Laravel 播种 MongoDB 时的 authenticationDatabase 错误

使用 node.js + react 服务器端渲染 + 通量 + mongodb 时的数据耦合策略

使用 MongoDB 时的 Graphql 接口

使用php时的mongodb错误[重复]

使用 Mongoose 时的 MongoDB 弃用警告