JUnit测试有效,但maven测试失败,因为在macOS上找不到库(DYLD_library_PATH)



我有一个简单的JUnit测试,我成功地在macOS Mojave上的Eclipse中运行了它。该类对动态库进行JNA调用,因此我必须设置运行时环境变量DYLD_LIBRARY_PATH

当我尝试在Eclipse内部或外部运行mvn test时,它们都失败了。

据我所知,原因是macOS的系统完整性保护,它清除了所有DYLD变量。然而,由于Eclipse内部的JUnit测试按设计工作,因此必须可以以某种方式设置它们。

我试着";破解";最后执行的mvnshell脚本:

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

最新更新