【问题标题】:JUnit test works, but maven test fails due to library not found on macOS (DYLD_LIBRARY_PATH)JUnit 测试有效,但由于在 macOS 上找不到库(DYLD_LIBRARY_PATH),maven 测试失败
【发布时间】:2020-09-10 16:18:59
【问题描述】:

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

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

据我所知,原因是 macOS 的 System Integrity Protectionwipes all DYLD variables。但是必须可以以某种方式设置它们,因为 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 是我的目标

类似问题:

【问题讨论】:

    标签: macos maven junit lotus-notes hcl-notes


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 2023-03-17
      • 2019-03-07
      • 2013-11-08
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多