【问题标题】:Java binding for LMDB, need help to refresh LMDB JNILMDB的Java绑定,需要帮助刷新LMDB JNI
【发布时间】:2014-08-01 19:57:14
【问题描述】:

我们在 Java 应用程序中使用 LMDB。 可用的 Java 绑定已有 1 年历史。 我想刷新 LMDBJNI https://github.com/chirino/lmdbjni

但是,项目所有者没有提供有关如何构建项目的任何说明。 所以我不能只克隆他的 git 存储库,然后删除新版本的 LMDB (https://git.gitorious.org/mdb/mdb.git) c 和 h 文件,然后重建它

似乎LMDB JNI下面正在使用hawkjni,但这是我所得到的。

这些是我尝试过的步骤

a) git clone https://github.com/chirino/lmdbjni.git b) cd lmdbjni; mvn 安装 它成功完成,但是生成的 JAR 没有编译实际的 lmdb 库。 所以我的测试程序失败了

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no lmdbjni64-99-vspmaster-SNAPSHOT in java.library.path, no lmdbjni-99-vspmaster-SNAPSHOT in java.library.path, no lmdbjni in java.library.path]
    at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
    at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
    at org.fusesource.lmdbjni.JNI.<clinit>(JNI.java:41)
    at org.fusesource.lmdbjni.Env.create(Env.java:42)
    at org.fusesource.lmdbjni.Env.<init>(Env.java:36)
    at com.db.locrefdcache.App.main(App.java:27)
    ... 6 more

c) 然后我想,我可能不能只为 lmdbjni 运行 mvn install,而是需要显式构建它的 64 位 Linux 子系统

所以我做到了 cd lmdbjni/lmdbjni-linux64 mvn 安装

在那里我可以看到它正在尝试运行配置脚本(由自动工具生成),但我得到了

...
[INFO] checking lmdb.h usability... no
[INFO] checking lmdb.h presence... no
[INFO] checking for lmdb.h... no
[INFO] configure: error: cannot find headers for lmdb
[INFO] rc: 1
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR

所以我不太明白的是 lmdb 文件(lmdb.h、mdb.c、midl.h)是否需要显式删除,或者 hawkjni 是否实际上需要在它们之前运行并创建某种'intermediate' c 和 h 文件稍后会被放入此构建环境中。


使用 LMDBJNI deephacks fork 时出现编译错误更新 重新编译的原因:DeepHacks 的 LMDBJNI 项目使用最新的 LMDB 为 LMDBJNI 生成了一个 maven 存档,但是它是用 Java 8 编译的(我们还没有使用)。所以我需要用 Java 7 重新编译它。

我修改了 pom.xml 并将 Sources 1.8 更改为 1.7 然后, mvn install -P linux64 产生错误

...
[INFO] [hawtjni:build {execution: default}]
[INFO] Extracting /home/dev01/.m2/repository/org/deephacks/lmdbjni/lmdbjni/0.1.3-SNAPSHOT/lmdbjni-0.1.3-SNAPSHOT-native-src.zip to /home/dev01/devel/3dp/lmdbjni/lmdbjni-linux64/target/native-build-extracted
[INFO] executing: /bin/sh -c make install
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] build failed: org.apache.maven.plugin.MojoExecutionException: Make based build did not generate: /home/dev01/devel/3dp/lmdbjni/lmdbjni-linux64/target/native-build/target/lib/liblmdbjni.so

【问题讨论】:

    标签: java-native-interface lmdb


    【解决方案1】:

    你可能会在这个正在积极维护的分叉上获得更好的运气

    https://github.com/deephacks/lmdbjni

    他们还在 Maven 中提供了 LMDB 本身,您可以在此处查看它是如何设置的

    https://github.com/deephacks/lmdb

    【讨论】:

    • 不幸的是,为 Java 8 编译的 linux-64 位 maven jar。运行测试时出现“Unsupported major.minor version 52.0”错误。所以我勇敢地尝试使用 Java 7 自己重新编译这个 lmdbjni 分支。我去了 pom.xml 并将 标记修改为 1.7(而不是 1.8)。这让我可以用 Java 7 编译 lmdbjni-0.1.3-SNASHOT.jar。但我仍然无法编译 lmdbjni-linux64,它是包含数据库实际 64 位本机代码的 jar。不过我会继续战斗:-)。
    【解决方案2】:

    它在我的机器上使用 Java 7 构建良好。您在构建包时提供了正确的配置文件吗?对于 linux,您必须使用: mvn install -P linux64

    【讨论】:

    • 不,不为我编译。我得到了
    • 我收到构建错误。我用错误 inf 更新了我原来的问题
    • hawtjni 依赖于 automake 和 libtool (sudo apt-get install build-essential automake1.10 libtool) 你安装了吗?
    • 是的,我已经安装了 automake (v 1.13.4) 和 libtool (v 2.4.2)。出于某种原因,我在想(我可能完全错了)linux64 中的 pom.xml 指的是没有创建的目录。我无法验证这一点,因为我不明白 maven 处理如何从该 pom 定义跳转到“正在执行:/bin/sh -c make install”。另一种方法,如果您可以使用 java 1.7 构建并推送到 maven,那么像我们这样的人就会得到预编译版本(虽然找出构建问题,但对我们来说会更安全)。
    • 是的,这可能是一种前进的方式,lmdbjni 毕竟不需要 java 8。看看我明天能否部署 1.7 版本,也许我们可以稍后解决构建问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多