java - 设置 java.library.path 进行测试

标签 java maven testing java-native-interface

其中一个测试使用了本地库:

System.loadLibrary("mylib");

libmylib.so 位于/usr/local/lib,所以我在配置VM选项中添加这个目录:-Djava.library.path=/usr/local/lib

但是,当我使用 Maven 运行测试时,此行抛出 UnsatisfiedLinkError:

no mylib in java.library.path

在没有这个选项的情况下调用 Java:

/usr/lib/jvm/java-8-oracle/bin/java -Dmaven.home=/opt/idea/plugins/maven/lib/maven3 -Dclassworlds.conf=/opt/idea/plugins/maven/lib/maven3/bin/m2.conf -Didea.launcher.port=7538 -Didea.launcher.bin.path=/opt/idea/bin -Dfile.encoding=UTF-8 -classpath /opt/idea/plugins/maven/lib/maven3/boot/plexus-classworlds-2.4.jar:/opt/idea/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher -Didea.version=15.0.3 test

捕获异常时打印 System.getProperty("java.library.path") 给出 /opt/idea/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib.显然,运行配置中的 VM 选项对 Maven 任务没有影响。

所以我尝试在 Maven 的 VM 选项中设置库路径:Settings->Build, Execution, Deployment->Build Tools->Maven->Runner->VM options。此选项对 java 调用命令有影响:

/usr/lib/jvm/java-8-oracle/bin/java -Djava.library.path=/usr/local/lib -Dmaven.home=/opt/idea/plugins/maven/lib/maven3 -Dclassworlds.conf=/opt/idea/plugins/maven/lib/maven3/bin/m2.conf -Didea.launcher.port=7539 -Didea.launcher.bin.path=/opt/idea/bin -Dfile.encoding=UTF-8 -classpath /opt/idea/plugins/maven/lib/maven3/boot/plexus-classworlds-2.4.jar:/opt/idea/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher -Didea.version=15.0.3 test

但即使现在使用此选项调用 Java,它仍然无法加载库,并且 System.getProperty("java.library.path") 仍然包含相同的内容!

如何为使用 Maven 调用的测试设置 java.library.path

最佳答案

您可以 add system properties to the maven-surefire-plugin当测试在 systemPropertyVariables 的帮助下运行时属性:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19.1</version>
  <configuration>
    <systemPropertyVariables>
      <propertyName>java.library.path</propertyName>
      <buildDirectory>/usr/local/lib</buildDirectory>
    </systemPropertyVariables>
  </configuration>
</plugin>

这将在运行测试时将 java.library.path 添加为系统属性。由于测试是在 fork 的 VM 中运行的,因此不会考虑您所做的修改。

关于java - 设置 java.library.path 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35366035/

相关文章:

java - ConcurrentHashMap 怎么可能没有 keySet() 方法呢?

java - eclipse for 循环分配按钮字符串

maven - Zeppelin 不加载 Maven jar

php - Laravel 测试 dontSee 否定英文文本

Laravel 功能测试。缓存模拟不起作用! CacheManager::driver(),但未指定预期

java - 变量 'adapter' 是从内部类中访问的。需要宣布最终

Java套接字: best way to retry upon Connection Refused exception?

Maven 多重父子层次结构

java - spring-boot: 运行多模块 Maven 项目

testing - 没有代码覆盖率的 HttpParameterBinding