使我的Java程序易于分发

时间:2011-05-20 15:11:32

标签: java deployment dll installer java-3d

我已经通过exe安装程序在PC上安装了Java 3D API,它只是在lib子目录中创建了一个j3dcore.jarvecmath.jarj3dutils.jar的新目录,并{{ 1}}在bin子目录中。

Netbeans没有问题,我的代码编译和执行顺利,但是一旦我构建了我的项目并尝试从命令提示符运行它,我得到j3dcore-ogl.dllUnsatisfiedLinkError

谷歌救援并给了我3个可行的解决方案:

  • 将dll文件复制到我的JRE的bin目录
  • 将dll文件的路径添加到库路径(no j3dcore-ogl in java.library.path
  • 使用java -Djava.library.path=dllpath加载程序中的dll(实际上我无法使用此工具)

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

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

4 个答案:

答案 0 :(得分:1)

  

使我的Java程序易于分发

如果您的意思是“最终用户容易”,请Java Web Start


路人问道:

  

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

是的,但更好,更好。您可以将每个平台的本机打包在单独的Jars中,并仅将它们提供给使用该本机的平台,即使在32和32之间对下载进行分区也是如此。 64位版本的原生代。

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

这一切都会自动发生在最终用户身上,他们点击链接,在被问到时批准信任对话框,并安装应用程序 - 可能与桌面集成,并在屏幕上显示为魔术。

JWS应用。使用本机需要以all-permissions安全级别进行分发,因为JVM无法保证任何“原生”的操作。

答案 1 :(得分:0)

如果您将dll放在与Jar相同的目录中,它是否有效? 如果是,您可以考虑像这样分发它。

答案 2 :(得分:0)

我想在Windows上%PATH%的所有文件夹中搜索DLL。 (UNIX flavor的LD_LIBRARY_PATH)

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

您似乎正在尝试将包含许多jar的产品打包为依赖项。您可以从One-Jar中受益。它声称拥有本机dll支持。

答案 3 :(得分: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个选项。