无法使字段 long java.nio.Buffer.address 可访问:模块 java.base 无法“打开 java.nio” - 使用 Java API 的 LMDB

Vis*_*han 10 java embedded-database lmdb

我正在尝试使用 LMDB 创建数据库和环境。我在 Env 上遇到问题。创造()。我为此使用了 LMDB 文档。

Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.lmdbjava.ByteBufferProxy.<clinit>(ByteBufferProxy.java:71)
    at org.lmdbjava.Env.create(Env.java:92)
    at Database.<init>(Database.java:23)
    at Index.main(Index.java:7)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field long java.nio.Buffer.address accessible: module java.base does not "opens java.nio" to unnamed module @4edde6e5
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:177)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:171)
    at org.lmdbjava.ByteBufferProxy$AbstractByteBufferProxy.findField(ByteBufferProxy.java:163)
    at org.lmdbjava.ByteBufferProxy$ReflectiveProxy.<clinit>(ByteBufferProxy.java:222)
    ... 4 more
Run Code Online (Sandbox Code Playgroud)

主要的:

public class Index {
    public static void main(String[] args) {
        Database db = new Database("./data", "DB.TEST");
    }
}

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

axi*_*sty 9

该问题与您正在使用的 LMDB 库和您正在使用的 JRE 之间的兼容性问题有关。Java 9 引入了 JPMS,即 Java 平台模块系统。您在 OP 中提供的错误消息表明您的应用程序正在 JRE 版本 9 或更高版本中运行,但您使用的 LMDB 库可能是为 Java 8 编译的。

您可以选择指示 JPMS 使用该--add-opens选项加载未命名模块中的类。

对于OP中的特定错误消息,您可以尝试将此选项添加到用于运行应用程序的命令中:

--add-opens=java.base/java.nio=ALL-UNNAMED

请参阅此处的添加打开部分: https: //docs.oracle.com/en/java/javase/16/migrate/migrate-jdk-8-later-jdk-releases.html#GUID-12F945EB-71D6-46AF -8C3D-D354FD0B1781

另请参阅: https: //blogs.oracle.com/javamagazine/post/its-time-to-move-your-applications-to-java-17-heres-why-and-heres-how

在此输入图像描述