Как использовать JACOB в приложении OSGi?

У меня есть приложение OSGI (точнее, на основе фреймворка Wisdom), в котором я хотел бы использовать библиотеку JACOB для взаимодействия с Office (цель - преобразовать PPT в изображения). Я могу легко добавить JACOB jar в мой CLASSPATH, но JACOB требует, чтобы dll был доступен в java.library.path переменная окружения.

Вопрос: Как я могу добавить его в мою сборку Maven?

РЕДАКТИРОВАТЬ Я использую Maven 3

3 ответа

Решение

Похоже, у JACOB есть какой-то специальный код, который напрямую связан с этим классом ошибок. Действительно, есть jacob.dll.path определяется в LibraryLoader с помощью которого можно дать Джейкобу абсолютный путь для доступа к jacob dll (который не использует напрямую System.loadLibrary). Установка этой библиотеки напрямую решила мою проблему.

У вас, вероятно, есть три возможности для этого варианта использования

MAVEN_OPTS

Вы могли бы использовать MAVEN_OPTS Переменная окружения для передачи в сборку Maven требуемый параметр JVM (для всей сборки, следовательно, применяется ко всем задействованным выполнениям плагина / цели):

export MAVEN_OPTS="-Djava.library.path=<path_to_dir>"

Однако это также будет применяться ко всем другим сборкам, связанным с той же средой. В задании Jenkins вы по-прежнему можете настраивать эту переменную для каждого задания, следовательно, изолированную в определенной сборке.

настройки.mvn

Начиная с Maven 3.3.1, вы можете иметь .mvn папка как часть соответствующего проекта и jvm.config Файл как идеальное место для такого варианта.

два новых необязательных файла конфигурации .mvn/jvm.config а также .mvn/maven.config, расположенный в базовом каталоге исходного дерева проекта. Если они присутствуют, эти файлы будут содержать параметры jvm и maven по умолчанию. Поскольку эти файлы являются частью исходного дерева проекта, они будут присутствовать во всех проверках проекта и будут автоматически использоваться при каждой сборке проекта.

В рамках официальных заметок о выпуске

В Maven непросто определить конфигурацию JVM для каждого проекта. Существующий механизм, основанный на переменной среды MAVEN_OPTS и использование ${user.home}/.mavenrc это другой вариант с недостатком не быть частью проекта.

Начиная с этого выпуска, вы можете определить конфигурацию JVM через ${maven.projectBasedir}/.mvn/jvm.config файл, который означает, что вы можете определить параметры для вашей сборки на основе проекта. Этот файл станет частью вашего проекта и будет зарегистрирован вместе с вашим проектом. Так что больше не нужно для MAVEN_OPTS, .mavenrc файлы. Так, например, если вы поместите следующие параметры JVM в ${maven.projectBasedir}/.mvn/jvm.config файл:

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true

Опции будут применены ко всем модулям в случае многомодульного проекта.

Ваш ${maven.projectBasedir}/.mvn/jvm.config следовательно, файл может предоставить следующее:

-Djava.library.path=<path_to_dir>

Основным преимуществом этого подхода является то, что конфигурация изолирована для соответствующего проекта и применяется ко всей сборке.

Конфигурации плагинов

Вы должны установить его для соответствующих плагинов и конфигурации, если таковые имеются. Например, плагин Maven Compiler предоставляет compilerArgs запись конфигурации для параметров JVM, плагин Maven Surefire предоставляет argLine Вариант конфигурации для того же и так далее.

Это наименее рекомендуемый подход, поскольку конфигурация дублируется и зачастую даже невозможна (вплоть до конфигурируемости плагина). Однако, если вариант использования действительно изолирован от выполнения определенного плагина (компиляция, тестирование и т. Д.), Он все равно может быть разумным.

Я немного запутался в части maven, так как она обычно не является частью библиотеки времени выполнения, когда вы используете OSGi.

В OSGi, если вы используете dll в вашей платформе OSGi, то все это может быть настроено платформой OSGi. Вы должны упаковать DLL в JAR и предоставить некоторые свойства. Во время выполнения фреймворк затем извлекает библиотеку и проверяет, найдена ли она. (Существует небольшая проблема с несколькими DLL, которые зависят друг от друга.)

Вот некоторая практическая информация о собственных библиотеках в OSGi:

http://enroute.osgi.org/appnotes/native-libraries.html

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