maven-nar-plugin и тесты в зависимом модуле
У меня есть два maven модуля:
- native-wrapper - это JNI-оболочка над системной библиотекой, созданная с помощью nar-maven-plugin.
- main-module - зависит от native-оболочки и использует ее вызовы JNI во время тестов.
Тесты в native-обертке работают нормально. Но во время тестов в основном модуле я получаю " UnsatisfiedLinkError " - NarSystem не может найти мою библиотеку JNI.
Pom родной оболочки включает в себя:
...
<packaging>nar</packaging>
...
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.0.0-rc-2</version>
<extensions>true</extensions>
<configuration>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>some.native.wrapper</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
Я открыл сгенерированный.nar в./target/ - он содержит "/lib/amd64-Linux-gpp/jni/libnative-wrapper-0.1.0-SNAPSHOT.so". Другой нар (с классами Java) содержит "/META-INF/nar/some.native.wrapper/native-wrapper/nar.properties".
POM основного модуля:
...
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>native-wrapper</artifactId>
<version>${project.version}</version>
<type>nar</type>
</dependency>
...
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.0.0-rc-2</version>
<extensions>true</extensions>
</plugin>
Если я удалю плагин nar-maven-plugin из pom основного модуля, maven не найдет никаких классов из модуля native-wrapper.
Как я могу заставить Нар найти библиотеку?
1 ответ
Кажется, нельзя просто добавить артефакт с <type>nar</type>
и запустить тесты. Вы должны установить правильный путь к библиотеке для Java самостоятельно. Я сделал это так (в дополнение к pom основного модуля):
<packaging>nar</packaging>
...
<properties>
<LIBRARY_PATH>${project.build.directory}/nar/native-wrapper-${project.version}-amd64-Linux-gpp-jni/lib/amd64-Linux-gpp/jni/:${project.build.directory}</LIBRARY_PATH>
</properties>
...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkMode>once</forkMode>
<environmentVariables>
<LD_LIBRARY_PATH>${LIBRARY_PATH}</LD_LIBRARY_PATH>
<DYLD_LIBRARY_PATH>${LIBRARY_PATH}</DYLD_LIBRARY_PATH>
</environmentVariables>
<systemProperties>
<property>
<name>java.library.tmpdir</name>
<value>${LIBRARY_PATH}</value>
</property>
<property>
<name>java.library.path</name>
<value>${LIBRARY_PATH}</value>
</property>
</systemProperties>
...
</plugin>