Как запустить файл Nar из командной строки?
Я использовал Eclipse и построил проект JNI на своей машине разработки, используя nar-maven
плагин. Это компилируется на нескольких архитектурах и оставляет меня с .nar
файлы.
Моя проблема в том, что теперь я хочу запустить основную программу в одном из классов Java в nar
, Я продолжаю получать UnsatisfiedLinkError
когда Java-программа пытается загрузить собственную библиотеку, которая должна быть в nar
файл. Теперь я понимаю, что .so
файл должен быть на java.library.path
но моя проблема в том, что я не вижу, где это сделать, поскольку единственная копия находится внутри nar
файл. У меня сложилось впечатление, что это будет сделано за кулисами, потому что я использую автоматически сгенерированный NarSystem.loadLibrary
метод в Java.
Подробности следуют.
Часть моего POM, настраивающая nar
плагин:
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>com.myco.package</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
В одном из моих классов Java у меня есть статический инициализатор, который вызывает автоматически сгенерированный метод для загрузки библиотеки:
static {
com.myco.package.NarSystem.loadLibrary();
}
После запуска mvn install
У меня есть следующие файлы в соответствующем подкаталоге моего локального .m2/repository
каталог:
maven-metadata-local.xml
_maven.repositories
project-0.0.1-arm-Linux-gpp-jni.nar
project-0.0.1.nar
project-0.0.1.pom
project-0.0.1-javadoc.jar
Я пытаюсь запустить из командной строки с этой командой:
java -cp /home/myname/.m2/repository/com/myco/project/0.0.1/project-0.0.1.nar com.myco.package.MainClass
Это начинает запускать соответствующую основную программу, поэтому он нашел часть Java. Когда он достигает точки, где он должен загрузить нативную библиотеку - статический блок выше - он выдает ошибку
Exception in thread "main" java.lang.UnsatisfiedLinkError: no project-0.0.1 in java.library.path
Этот вопрос, зависимость Nar в мультимодульном проекте maven, выглядел так, как будто он будет близок, но ответ зависит от того, каким образом уже была "разоблачена" нативная библиотека. Я последовал за спрашивающим там, пытаясь mvn nar:nar-unpack
а также mvn exec:java
, но это не продвинуло меня. (Получите тот же явно нулевой результат от первого, как описано в этом вопросе, и то же исключение, которое я описал здесь для второго.)
Другие вопросы рассмотрены:
- Maven - UnsatisfiedLinkError с java.library.path Похоже, что это поиск библиотек вне процесса maven. Ответ дан с точки зрения файлов конфигурации maven, который, кажется, не помогает, когда я развернут.
- maven-nar-plugin и тесты в зависимом модуле. Это касается проблемы, специфичной для запуска тестов.
- nar-maven-plugin и native-library-loader не загружают native lib. Этот файл близок, но в любом случае не имеет ответа. Кажется, все по-другому, так как этот автор пытался как-то указать путь к библиотеке в командной строке.
- Использование нативного артефакта Maven (nar) в веб-приложении Этот вопрос касается включения в веб-приложение, поэтому он отличается. Кажется, он предлагает эту подсказку: "Оба они созданы как артефакты NAR, и для их использования требуется плагин maven-nar". Но я не понял, как плагин нужно использовать!
Так как мне запустить эту основную программу из командной строки? Если есть какой-то шаг предварительной обработки, чтобы "извлечь" нативную библиотеку, что это? Если это автоматически, то чего мне не хватает? Спасибо!
1 ответ
Я получил совет и, наконец, получил его!
Эта зависимость должна быть добавлена в POM:
<dependency>
<groupId>org.scijava</groupId>
<artifactId>native-lib-loader</artifactId>
<version>2.2.0</version>
</dependency>
После этого я мог запустить его, используя
mvn exec:java -Dexec.mainClass=com.myco.package.MainClass
Попытка запустить его напрямую с java
из командной строки все еще падал, но в этом случае он падал, потому что не находил фляги для зависимостей. Предположительно я мог бы запустить его сейчас без Maven, если бы мне нужно было указать записи пути к классам для всех них с помощью -cp
флаг.