Как открыть базу данных LMDB в Java?

Я пытаюсь открыть базу данных LMDB, используя ее Java API.

Это мой Database класс:

import java.io.File;
import java.nio.ByteBuffer;
import java.nio.file.Paths;
import org.lmdbjava.Dbi;
import static org.lmdbjava.DbiFlags.MDB_CREATE;
import org.lmdbjava.Env;
import org.lmdbjava.Txn;

public class Database {

    private String dbName;
    private String dbDirectoryName;
    private File dbDirectory;
    private Env<ByteBuffer> dbEnvironment;
    private Dbi<ByteBuffer> db;

    public Database(String _dbDirectoryName, String _dbName) {

        dbName = _dbName;
        dbDirectoryName = _dbDirectoryName;
        dbDirectory = new File(dbDirectoryName);

        dbEnvironment = Env.create().setMapSize(1_073_741_824).setMaxDbs(1).open(dbDirectory);
        db = dbEnvironment.openDbi(dbName, MDB_CREATE);

    }        

    public void Close() {
        dbEnvironment.close();
    }


}

И мой основной класс:

public class TestApp {

    public static void main(String[] args) {

        Database db = new Database("./data", "DB.TEST");

    }

}

Я дважды проверяю, существует ли каталог data.

Я получаю следующую ошибку:

run:
Exception in thread "main" java.lang.NoClassDefFoundError: jnr/ffi/byref/PointerByReference
    at org.lmdbjava.Env$Builder.open(Env.java:460)
    at org.lmdbjava.Env$Builder.open(Env.java:486)
    at database.Database.<init>(Database.java:41)
    at TestApp.main(TestApp.java:25)
Caused by: java.lang.ClassNotFoundException: jnr.ffi.byref.PointerByReference
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 4 more

Этот тест пытается следовать существующей документации для LMDB Java API:

https://github.com/lmdbjava/lmdbjava/blob/master/src/test/java/org/lmdbjava/TutorialTest.java


person M.E.    schedule 19.11.2019    source источник
comment
Кажется, вам не хватает некоторых зависимостей   -  person Maurice Perry    schedule 19.11.2019
comment
Вы запускаете/собираете это через Maven? Проект, на который вы ссылаетесь, ссылается на пару зависимостей в своем pom.xml, которые вам понадобятся в вашем пути к классам.   -  person Thilo    schedule 19.11.2019


Ответы (2)


Требуемый тип находится в jnr-ffi-[version].jar.

person Ben Alex    schedule 19.11.2019
comment
Добавлен jnr-ffi-[версия].jar с некоторыми зависимостями, и теперь он работает нормально. Поскольку проект использует Maven, а я его не использовал, я пропустил зависимости. - person M.E.; 20.11.2019

Скорее всего, вам не хватает зависимости, или файл jar, содержащий класс jnr.ffi.byref.PointerByReference, отсутствует в пути к классам.

Проверьте: https://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html

В зависимости от того, какой инструмент вы используете, добавьте зависимость к pom.xml или build.gradle или добавьте ее в путь к классам.

person dawidklos    schedule 19.11.2019