0

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

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

据我所知,原因是 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} "$@"

通过DYLD_LIBRARY_PATH在命令之前设置exec,没有成功。还尝试先修补$JAVACMD设置变量,没有运气。

我错过了哪些选项(没有禁用 SIP)?

我不是在寻找通用的解决方案,跑步mvn是我的目标

类似的问题:

4

1 回答 1

0

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

于 2020-09-21T12:49:31.250 回答