Как использовать 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: