问题描述
我有一个简单的JUnit测试,可以在macOS Mojave上的Eclipse中成功运行。该类对动态库进行JNA调用,因此我必须设置运行时环境变量DYLD_LIBRARY_PATH
当我尝试在Eclipse内部或外部运行mvn test
时,它们将失败。
据我了解,原因是macOS的System Integrity Protection。但是,一定可以设置它们,因为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} "$@"
通过在DYLD_LIBRARY_PATH
命令前紧接设置exec
,但未成功。
还尝试修补$JAVACMD
来首先设置变量,没有运气。
我错过了哪些选择(禁用SIP除外)?
我不是在寻找通用解决方案,运行mvn
是我的目标
类似的问题:
- wipes all
DYLD
variables - Why isn't DYLD_LIBRARY_PATH being propagated here?
- LD_LIBRARY_PATH and DYLD_LIBRARY_PATH not imported on OS X
解决方法
我找到了一个解决方案,我不喜欢它,但是它似乎有效。 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