部署使我的Java程序易于分发
我已经通过exe安装程序在PC上安装了Java3DAPI,它只是创建了一个新目录,其中lib子目录中有j3dcore.jar
、vecmath.jar
、j3dutils.jar
和bin子目录中的j3dcore-ogl.dll
Netbeans没有任何问题,我的代码编译和执行都很顺利,但是一旦我构建了我的项目并试图从命令提示符下运行它,我得到一个UnsatisfiedLinkError
的消息说no j3dcore-ogl in java.library.path
谷歌拯救了我,给了我3个可行的解决方案:
- 通过将dll文件复制到我的JRE的bin目录中
- 通过将dll文件的路径添加到库路径(
java -Djava.library.path=dllpath
) - 用
System.load()
加载程序中的dll(实际上,我无法使这个dll正常工作)
我的问题是:这个问题有没有一个我错过的优雅的解决方案
对于每个想在其上使用此程序的不同PC机,他必须复制dll或将其添加到库路径,然后才能运行,这似乎很乏味。(附带问题:Netbeans为什么没有dll问题?)
# 1 楼答案
编辑-重读您的问题后,您的问题听起来不同。但是,我可以像这样运行,只需将所有dll文件放在与服务器相同的目录中。启动java进程的bat文件:
java-classpath/你的罐子。jar/lib/j3dcore。jar/lib/vecmath。jar/lib/j3dutils。罐子包装。MainClass
这在多个用户的PC上有效,所以我知道简单地把它放到工作目录中就行了
我相信这取决于所使用的Java版本-64位或32位。正确的dll文件(同名)必须位于工作目录中
我想当使用错误的dll时,我也遇到了类似的问题,而且它不依赖于操作系统(如果您的64位操作系统安装了32位Java,则需要32位j3dcore-ogl.dll文件)
所以问题是,您使用的是哪个版本的Java(在IDE之外运行时),以及您将哪个版本的dll(如果有的话)放在工作目录中?我不需要在我的路径设置中使用任何dll文件,就可以在别人的电脑上运行,并且没有使用系统。load(),并且没有将文件复制到我用户的JRE/bin目录中-因此我知道,如果没有您提到的3个选项,这是可能的
# 2 楼答案
如果您将DLL放在与Jar相同的目录中,它会工作吗? 如果是的话,你可以考虑这样分配。
# 3 楼答案
我猜在windows上%PATH%的所有文件夹中都会搜索DLL。(UNIX版本的LD_库_路径)
能否尝试将dll的路径添加到%path%变量
似乎您正在尝试打包一个产品,其中包含许多JAR作为依赖项。你可能会从One-Jar中受益。它声称具有本机dll支持
# 4 楼答案
如果您的意思是“方便最终用户”,请查看Java Web Start
一个过路人问:
是的,但是好多了。您可以将每个平台的本机打包在单独的jar中,并仅将它们提供给使用该本机的平台,甚至可以将下载划分为32&;本地版本的64位版本
JWS将本机放在应用程序的运行时类路径上,准备加载代码
这一切对于最终用户来说都是自动发生的,他们单击一个链接,在请求时批准信任对话框,然后安装应用程序——可能是桌面集成,并像魔术一样出现在屏幕上
JWS应用程序。使用本机的操作需要作为
all-permissions
安全级别分发,因为JVM不能保证任何“本机”操作