install4j 支持通过 System.loadLibrary 加载 dyld 库的代码签名 MacOS 控制台启动器

install4j support for code signing MacOS console launchers that load dyld libraries via 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 启动器(我 运行ning Big Sur)。或者是不可能 运行 在按需加载 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 是一个很好的解决方案,比设置权利更可取。