install4j 支持通过 System.loadLibrary

问题描述

我使用 install4j 8.0.8 创建的 MacOS 文件夹 DMG 媒体文件有问题。如果我对包进行代码签名,则所有内容都会正确签名,包括驻留在 lib/ 目录中的 *.dyld 文件。此外,我的 GUI 程序工作正常,对 System.loadLibrary() 的调用成功并正确加载 dyld 文件。但是,当我的命令行程序调用与我的 GUI 程序相同的 Java 代码时,它们会在调用 System.loadLibrary() 时失败并显示以下消息:

java.lang.UnsatisfiedLinkError: jhdf5 (Not found in java.library.path)
    at java.base/java.lang.classLoader.loadLibraryWithPath(ClassLoader.java:1745)
    at java.base/java.lang.classLoader.loadLibraryWithClassLoader(ClassLoader.java:1697)
    at java.base/java.lang.System.loadLibrary(System.java:591)

但是,如果我在为 MacOS 构建媒体文件时禁用代码签名,这是通过从 Ant 传递 disableSigning=true 来实现的,GUI 和命令行程序都可以正常工作。

所以可能,我不明白在 MacOS 上从控制台启动器和 GUI 启动器运行程序时是否需要对 Java VM 参数做一些额外的事情(我正在运行 Big苏)。还是无法在按需加载 dyld 文件代码签名媒体文件中运行控制台启动器?可能是因为控制台启动器在 MacOS 上是作为脚本实现的。 install4j 8 文档似乎没有提到我可以找到的这种细微差别。

安装文件的目录结构如下:

Peters-MacBook-Pro-16:CoastWatch Utilities Signed phollema$ ll
total 4224
drwxr-xr-x  10 phollema  admin      320  9 Apr 17:25 .
drwxrwxr-x  37 root      admin     1184  9 Apr 17:24 ..
drwxr-xr-x  53 phollema  admin     1696  9 Apr 17:25 .install4j
drwxr-xr-x   3 phollema  admin       96  9 Apr 17:24 CoastWatch Utilities Uninstaller.app
drwxr-xr-x  25 phollema  admin      800  9 Apr 18:50 bin
drwxr-xr-x   3 phollema  admin       96  9 Apr 17:24 data
drwxr-xr-x   8 phollema  admin      256  9 Apr 17:25 doc
drwxr-xr-x   3 phollema  admin       96  9 Apr 17:24 extensions
drwxr-xr-x   4 phollema  admin      128  9 Apr 17:25 lib
-rw-r--r--   1 phollema  admin  1608406  9 Apr 17:12 src.zip
Peters-MacBook-Pro-16:CoastWatch Utilities Signed phollema$ ll bin
total 624
drwxr-xr-x  25 phollema  admin    800  9 Apr 18:50 .
drwxr-xr-x  10 phollema  admin    320  9 Apr 17:25 ..
-rw-r--r--@  1 phollema  admin   6148  9 Apr 18:50 .DS_Store
drwxr-xr-x   3 phollema  admin     96  9 Apr 17:24 CoastWatch Data Analysis Tool.app
drwxr-xr-x   3 phollema  admin     96  9 Apr 17:24 CoastWatch Master Tool.app
drwxr-xr-x   3 phollema  admin     96  9 Apr 17:24 CoastWatch Status Tool.app
-rwxr-xr-x   1 phollema  admin  14801  9 Apr 17:12 cwangles
-rwxr-xr-x   1 phollema  admin  14803  9 Apr 17:12 cwautonav
-rwxr-xr-x   1 phollema  admin  14829  9 Apr 17:12 cwcomposite
-rwxr-xr-x   1 phollema  admin  14827  9 Apr 17:12 cwcoverage
-rwxr-xr-x   1 phollema  admin  14805  9 Apr 17:12 cwdownload
-rwxr-xr-x   1 phollema  admin  14801  9 Apr 17:12 cwexport
-rwxr-xr-x   1 phollema  admin  14827  9 Apr 17:12 cwgraphics
-rwxr-xr-x   1 phollema  admin  14789  9 Apr 17:12 cwgscript
-rwxr-xr-x   1 phollema  admin  14823  9 Apr 17:12 cwimport
-rwxr-xr-x   1 phollema  admin  14797  9 Apr 17:12 cwinfo
-rwxr-xr-x   1 phollema  admin  14819  9 Apr 17:12 cwmath
-rwxr-xr-x   1 phollema  admin  14805  9 Apr 17:12 cwnavigate
-rwxr-xr-x   1 phollema  admin  14829  9 Apr 17:12 cwregister
-rwxr-xr-x   1 phollema  admin  14831  9 Apr 17:12 cwregister2
-rwxr-xr-x   1 phollema  admin  14823  9 Apr 17:12 cWrender
-rwxr-xr-x   1 phollema  admin  14801  9 Apr 17:12 cwsample
-rwxr-xr-x   1 phollema  admin  14841  9 Apr 17:12 cwscript
-rwxr-xr-x   1 phollema  admin  14799  9 Apr 17:12 cwstats
-rwxr-xr-x   1 phollema  admin  14763  9 Apr 17:12 hdatt
Peters-MacBook-Pro-16:CoastWatch Utilities Signed phollema$ ll lib/native/macosx_x86_64/
total 12544
drwxr-xr-x  4 phollema  admin      128  9 Apr 17:25 .
drwxr-xr-x  3 phollema  admin       96  9 Apr 17:25 ..
-rw-r--r--  1 phollema  admin  1748128  9 Apr 17:12 libjhdf.dylib
-rw-r--r--  1 phollema  admin  3536000  9 Apr 17:12 libjhdf5.dylib

此外,控制台启动程序脚本包含一行添加DYLD_LIBRARY_PATH 中,如下所示:

DYLD_LIBRARY_PATH="$app_home/lib/native/macosx_x86_64:$DYLD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH

如果我不对媒体文件进行签名,所有这些都可以工作,并且控制台启动程序脚本是相同的。

解决方法

公证需要启用“强化运行时”,除非为启动器可执行文件设置了特定的授权,否则它会阻止使用 DYLD_LIBRARY_PATH。从 install4j 9.0.1 开始,只能为 GUI 启动器设置授权,而不能为命令行启动器所需的捆绑 JRE 的 java 可执行文件设置。

然而,设置 -Djava.library.path 是一个很好的解决方案,比设置权利更可取。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...