发生了JNI错误-Docker Oracle NoSQL容器

时间:2019-04-02 15:18:50

标签: java docker java-native-interface oracle-nosql

我已经进行了几天的研究,这是我的最后一颗子弹,希望你们能为我提供帮助。

我基本上是在尝试在Oracle 12c关系数据库中创建一个指向我的Oracle NoSQL数据库表的外部表。我这样做是按照this tutorial进行的。一切顺利,直到到达第4点为止,在第4点处,您使用一些库生成了“ .dat”文件。我有自己的案例,有自己的数据,但您可以看到流程here的完整示例。

执行以下命令时会遇到我遇到的问题:

  

java -cp ./lib/kvstore-ee.jar:./lib/ojdbc6.jar oracle.kv.exttab.Publish -config ./exttab/nueva.xml -publish -verbose

这会导致以下错误:

Picked up _JAVA_OPTIONS: -Djava.security.egd=file:/dev/./urandom
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: oracle/kv/KVStoreException

        at java.lang.Class.getDeclaredMethods0(Native Method)
            at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
            at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
            at java.lang.Class.getMethod0(Class.java:3018)
            at java.lang.Class.getMethod(Class.java:1784)
            at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
            at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
    Caused by: java.lang.ClassNotFoundException: oracle.kv.KVStoreException
            at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
            ... 7 more

现在,我着手尝试解决的问题:

  • 不同的JDK版本
  • 涉及的.jar文件的不同版本。
  • 将文件切换到父目录
  • 从不同目录执行命令。
  • 检查手工涉及的类中的代码,看它是否与Oracle提供的原始代码不同

在这一点上,我不知道是我做错了事情还是环境本身有问题。我只需要能够执行此操作即可生成“ .dat”文件,但我找不到办法。如果有帮助,我会在此处留下一些信息:

环境I am using a Docker container with an Oracle NoSQL distribution。在这种环境下,我已经安装了以下jdk版本:

  • java版本“ 1.8.0_73” Java(TM)SE运行时环境(内部版本 1.8.0_73-b02)Java HotSpot(TM)64位服务器VM(内部版本25.73-b02,混合模式)

我在命令中提到的路径中具有所有必需的jar文件,当然还有XML文件。我还可以为您提供环境变量,配置文件代码或基本上您需要的任何东西,但是到那时我迷路了。预先感谢。

1 个答案:

答案 0 :(得分:0)

我对Jorn Vernee中的建议很感兴趣,我再次在库中检查该类在哪里,因为我确定自己在某个地方看到了它。

还有一个名为kvstore.jar的另一个库,其中包含用于数据库的实用程序。如您所见,该命令没有使用oracle.kv.KVStoreException在这里的库。

简而言之,解决方案是将这个jar添加到命令中,结果是:

java -cp ./lib/kvstore-ee.jar:./lib/kvstore.jar:./lib/ojdbc6-11.2.0.3.jar oracle.kv.exttab.Publish -config ./exttab/nueva.xml -publish -verbose

然后命令执行正常。谢谢你的想法!