Jam*_*mes 10 clojure leiningen jmonkeyengine
在64位JVM上,在Linux中,无论本机库加载是什么,都会尝试加载32位库.
我问这是一个clojure和(甚至更多)java n00b.
我到目前为止找到的答案(在Leiningen/Clojure中使用lwjgl似乎是搜索结果中最突出的)似乎是旧版本的lein,问题围绕着:native-dependencies或project.clj中的LD_LIBRARY_PATH.
我正在重新发明轮子并将基本的jME教程翻译成clojure作为一个小的个人家庭作业,以学习它们.在迄今为止我发现人们如何做到这一点的所有教程和示例中,这部分似乎"正常工作".
(在Windows下,它对我来说很好用).
我正在使用lein构建一个新的空项目.我已经在clojars上设置了各种版本的jMonkeyEngine库的依赖项.在'lein deps'之后,liblwjgl64.so和libopenal64.so结束在我的项目目录的根目录中.
当我尝试'lein run'时,它会显示设置的Monkey splash屏幕,然后在尝试实际运行时抛出异常,因为它正在尝试加载liblwjgl.so.
该文件存在于target/native/linux和target/native/linux64下(但奇怪的是,不在target/native/linux32下).
如果我将它想要的文件复制到项目的根目录中,则错误会更改为"错误的ELF类:ELFCLASS32(可能的原因:架构字宽度不匹配)",这是Google一直在给我的另一组讨论.这里提到的解决方案似乎都相当于"切换到32位JVM以使Minecraft正常工作",但我更倾向于获得有关正在发生的事情的实际线索.
这个问题在我可以在clojars中得到的每一组依赖库都非常一致(回到版本2,无论如何......那些有更大的问题,似乎不值得深入研究).查尔斯污渍在窗户上为我设置了"Just Worked".
到目前为止,我能够提出的最好的假设是这样的:
我怀疑某个版本必须在某个时候指定.http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/syntax.html#resources提到了一个看起来非常合适的资源属性,但这似乎没什么用与JNLP合作.我想知道是否有一个明显的文件坐在.jar的某个地方我无法找到(这里是我的n00bishness发挥作用...我真的不知道我在寻找什么).
那么,有没有人有任何关于我应该看的地方或者我应该问什么的指示?我不知道甚至不知道从哪里开始.讨论jMonkeyEngine论坛,#clojure或者lwjgl邮件列表(或者他们使用的任何东西......我实际上根本没有考虑过他们的一面......我应该吗?)
接下来我将尝试将jME库捆绑到我自己的存储库中.这似乎是一项艰巨而艰巨的任务,当我正在解决这个问题时,我决定在这里提出要求.
我知道这很模糊,我为此道歉.我的google-fu让我失望了.我很感激任何人都可以提出任何建议.
提前致谢!
在 Java 程序中使用本机库一开始可能会很痛苦,但实际上并没有那么复杂。
首先,您的错误wrong ELF class: ELFCLASS32意味着某些64位程序试图加载32位共享库。显然,当程序查找库的路径上存在具有所需名称的 32 位库,但程序本身是 64 位时,就会发生这种情况。这几乎就是对错误的解释。
现在,关于问题的主要部分。确实有多种方法可以在 Java 应用程序中使用本机库,其中一些甚至涉及环境变量。但在我看来,最简单的方法是指定 Java系统属性 java.library.path,它的目的正是为了管理本机库。此属性应指向程序的所有本机库所在的目录。JVM 将在该目录中查找所有必需的共享对象。
当直接运行 JAR 文件时,可以在命令行中指定系统属性,如下所示:
java -Djava.library.path=natives/linux64 -jar yourprogram.jar
Run Code Online (Sandbox Code Playgroud)
在这里,我们指定相对于当前目录的库路径。就我而言,这是为独立应用程序设置属性的首选方法,通常由脚本启动。
至于 REPL,似乎可以在内部为其设置 JVM 选项project.clj,如下所示:
(defproject project "version"
...
:jvm-opts ["-Djava.library.path=target/natives/linux64"])
Run Code Online (Sandbox Code Playgroud)
我不记得 REPL 的默认工作目录是什么,所以这可能需要对确切路径进行一些实验,但你已经明白了。
现在,我正在自己开发 lwjgl 程序(虽然不是在 Clojure 中,而是在纯 Java 中,使用 Maven),真正需要的是从 jar 中提取本机库(maven-native-plugin执行此操作)并java.library.path为它们设置。
顺便说一句,看起来 leiningen 支持project.clj,中的另一个重要选项:native-path,它似乎启用了类似maven-native-plugin功能:它指定了一个目录,所有本机依赖项都应提取到该目录。将此结合起来:jvm-opts应该会给你正确的独立于平台的 REPL :)