0

我已经通过 exe 安装程序在 PC 上安装了 Java 3D API,它只是在 lib 子目录和bin 子目录中创建了一个带有j3dcore.jar,vecmath.jar的新目录。j3dutils.jarj3dcore-ogl.dll

Netbeans 没有问题,我的代码编译和执行都很顺利,但是一旦我构建了我的项目并尝试从命令提示符运行它,我得到了一个UnsatisfiedLinkError说法,即no j3dcore-ogl in java.library.path.

谷歌出手相救,给了我 3 个可行的解决方案:

  • 通过将 dll 文件复制到我的 JRE 的 bin 目录中
  • 通过将 dll 文件的路径添加到库路径 ( java -Djava.library.path=dllpath)
  • 在程序中加载dll System.load()(实际上我无法让这个工作)

我的问题是:我错过了这个问题的优雅解决方案吗?

对于每个想要使用这个程序的不同 PC,他必须复制 dll 或将其添加到库路径才能运行,这似乎很乏味。(附带问题:为什么 Netbeans 的 dll 没有问题?)

4

4 回答 4

1

使我的 Java 程序易于分发

如果您的意思是“对最终用户来说很容易”,请查看Java Web Start


路人问:

可以用 Web Start 打包 dll 依赖项吗?

是的,但是好多了。您可以将每个平台的本机打包在单独的 Jar 中,并仅将它们提供给使用该本机的平台,即使在本机的 32 位和 64 位版本之间划分下载也是如此。

JWS 将本机放在应用程序的运行时类路径上,准备好加载代码。

这一切都为最终用户自动发生,他们单击链接,在被询问时批准信任对话框,然后应用程序安装 - 可能与桌面集成,并像魔术一样出现在屏幕上。

JWS 应用程序。使用本机的需要作为all-permissions安全级别进行分发,因为 JVM 不能保证任何“本地化”的操作。

于 2011-05-20T18:21:23.077 回答
0

我猜想在 Windows 上的 %PATH% 中的所有文件夹中搜索 DLL。(对于 UNIX 风格的 LD_LIBRARY_PATH)

您可以尝试将 dll 的路径添加到 %path% 变量吗?

看来您正在尝试将具有许多 jar 的产品打包为依赖项。您可能会受益于 One-Jar。它声称具有本机 dll 支持。

于 2011-05-20T17:50:39.057 回答
0

编辑 - 重新阅读您的问题后,您的问题听起来不同。但是,我可以像这样运行,只需将所有 dll 文件放在与启动 java 进程的 .bat 文件相同的目录中:

java -classpath ./YourJar.jar;./lib/j3dcore.jar;./lib/vecmath.jar;./lib/j3dutils.jar package.MainClass

这适用于多个用户的 PC,所以我知道只需将其放入工作目录即可。

我相信这取决于所使用的 Java 版本 - 64 位或 32 位。正确的 dll 文件(同名)需要在工作目录中。

我想我在使用错误的 dll 时遇到了类似的问题,而且它与操作系统无关(如果您的 64 位操作系统安装了 32 位 Java,则需要 32 位 j3dcore-ogl.dll 文件)。

所以问题是,您使用的是哪个版本的 Java (在您的 IDE 之外运行时),以及您将哪个版本的 dll(如果有)放在工作目录中?我的路径设置中不需要任何 dll 文件来使其在其他 PC 上运行,并且没有使用 System.load(),也没有将文件复制到我用户的 JRE/bin 目录中 - 所以我知道这是可能的你提到的3个选项。

于 2011-06-17T02:07:29.390 回答
0

如果将 dll 放在与 Jar 相同的目录中,它会起作用吗?如果是,您可以考虑像这样分发它。

于 2011-05-20T15:17:14.947 回答