我有一个简单的JUnit测试,我成功地在macOS Mojave上的Eclipse中运行了它。该类对动态库进行JNA调用,因此我必须设置运行时环境变量DYLD_LIBRARY_PATH
当我尝试在Eclipse内部或外部运行mvn test
时,它们都失败了。
据我所知,原因是macOS的系统完整性保护,它清除了所有DYLD
变量。然而,由于Eclipse内部的JUnit测试按设计工作,因此必须可以以某种方式设置它们。
我试着";破解";最后执行的mvn
shell脚本:
exec "$JAVACMD"
$MAVEN_OPTS
$MAVEN_DEBUG_OPTS
-classpath "${CLASSWORLDS_JAR}"
"-Dclassworlds.conf=${MAVEN_HOME}/bin/m2.conf"
"-Dmaven.home=${MAVEN_HOME}"
"-Dlibrary.jansi.path=${MAVEN_HOME}/lib/jansi-native"
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}"
${CLASSWORLDS_LAUNCHER} "$@"
通过在紧接exec
命令之前设置DYLD_LIBRARY_PATH
而没有成功。还试图先修补$JAVACMD
以设置变量,但没有成功。
我错过了哪些选项(除了禁用SIP(?
我不是在寻找通用的解决方案,运行mvn
是我的目标
类似问题:
- 为什么DYLD_LIBRARY_PATH没有在这里传播
- 未在OS X上导入LD_LIBRARY_PATH和DYLD_LIBRARY_PATH
- 如何在macos上设置LD_LIBRARY_PATH/DYLD_LIBRARY_PATH
我找到了一个解决方案,我不喜欢它,但它似乎有效。JNA调用用于加载使用@executable_path
注释的其他代码。运行Java时,可执行文件是JVM,而不是原始应用程序,因此JNA调用将失败。
链接整个程序目录(然后清理(对我来说很有用。我对mvn
的调用如下:
#!/bin/bash
# Ugly hack to make mvn play ball
JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
for onelib in $(ls /Applications/HCL Notes.app/Contents/MacOS)
do
echo "Linking /Applications/HCL Notes.app/Contents/MacOS/${onelib}"
sudo ln -s /Applications/HCL Notes.app/Contents/MacOS/${onelib} ${JAVA_HOME}/jre/bin/${onelib}
done
# Maven test
mvn test
# Cleanup
sudo find $JAVA_HOME/jre/bin -maxdepth 1 -type l -delete
YMMV