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
是一个很好的解决方案,比设置权利更可取。
我使用 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
是一个很好的解决方案,比设置权利更可取。