在 libfontmanager.dylib 中将 OpenJDK9 与 FreeType @ref 捆绑在一起

Bundle OpenJDK9 with FreeType @ref in libfontmanager.dylib

我正在尝试将 FreeType 与我的 Mac 版本的 OpenJDK9 捆绑在一起,但是在构建完成后我无法引用 libfreetype。我将 JDK 与我的应用程序打包在一起,并且不希望最终用户必须安装 FreeType 才能使应用程序正常工作(我们使用的 JDK7 版本可以满足我的要求,但是我不是构建它的人,所以不知道他们做了什么才能让它发挥作用)。

下载 FreeType 2.5.3 后(我也使用过 2.8.1,但我认为使用哪个版本并不重要,因为 OpenJDK 表示任何超过 2.3 的版本都适用于 Java 9),我 运行ning(只是用变量填充路径,因为它们并不重要)

./configure prefix=$DOWNLOAD_PATH/freetype-2.5.3
make
make install

然后构建我的 JDK,我 运行ning

bash ./configure --with-freetype=$DOWNLOAD_PATH/freetype-2.5.3 --with-boot-jdk=$PATH_TO_JDK1.8/Contents/Home --disable-warnings-as-errors
make images

这会很好地构建 JDK 并将 libfreetype.dylib.6 捆绑到 jdk/lib 目录中,但是当我打开 libfontmanager.dylib 时,我可以看到它是指向 $DOWNLOAD_PATH/freetype-2.5.3/lib/libfreetype.6.dylib 而不是 @rpath/libfreetype.6.dylib

因为它没有使用相对路径(即使它成功地捆绑了文件),当我 运行 应用程序它正在寻找 $DOWNLOAD_PATH 存在以找到 dylib 文件(这不是因为那个位置只在我用来构建 JDK 的 Mac 上),所以我得到一个看起来像这样的错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /Applications/Launcher.app/Contents/PlugIns/jdk-9.jdk/Contents/Home/jre/lib/libfontmanager.dylib:
  dlopen(/Applications/Launcher.app/Contents/PlugIns/jdk-9.jdk/Contents/Home/jre/lib/libfontmanager.dylib, 
  1): Library not loaded: /$DOWNLOAD_PATH/freetype-2.5.3/lib/libfreetype.6.dylib
  Referenced from: /Applications/Launcher.app/Contents/PlugIns/jdk-9.jdk/Contents/Home/jre/lib/libfontmanager.dylib
  Reason: image not found
    at java.base/java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.base/java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)
    ...

如何让我的构建在此处使用 @rpath 而不是引入 FreeType 的绝对路径?它成功地捆绑了文件(libfreetype.6.dylib 在 jre/lib 目录中),只是没有在 libfontmanager.dylib.

中指向它

对于任何相关人员,此问题存在一个 JDK 错误,该错误已于 12 月关闭,它承认该错误并通过使用 install_name_tool 手动修改 dylib 文件提供了解决方法在创建 jdk 后使用 @rpath。

这是错误的 link:https://bugs.openjdk.java.net/browse/JDK-8139653?jql=text%20~%20%22freetype%22

我发现这个解决方案最容易遵循:https://github.com/AdoptOpenJDK/openjdk-build/issues/489#issuecomment-446181769

cd <JDK path>/Contents/Home/jre/lib 
sudo ln -s libfreetype.dylib.6 libfreetype.6.dylib