Как запустить файл 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, но это не продвинуло меня. (Получите тот же явно нулевой результат от первого, как описано в этом вопросе, и то же исключение, которое я описал здесь для второго.)

Другие вопросы рассмотрены:

Так как мне запустить эту основную программу из командной строки? Если есть какой-то шаг предварительной обработки, чтобы "извлечь" нативную библиотеку, что это? Если это автоматически, то чего мне не хватает? Спасибо!

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 флаг.

Другие вопросы по тегам