JUnit测试有效,但由于在macOS上找不到库DYLD_LIBRARY_PATH,Maven测试失败

问题描述

我有一个简单的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是我的目标

类似的问题:

解决方法

我找到了一个解决方案,我不喜欢它,但是它似乎有效。 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