Maven проект с нативной зависимостью и копированием файлов - PullRequest
6 голосов
/ 22 сентября 2011

У меня есть следующий сценарий:

mylib - это библиотека (для которой у меня есть источники, поэтому я бы хотел поместить их в проект Maven mylib: например, mylib). Эта библиотека имеет зависимость от jar, для которой у меня есть только jar, и ее нет в репозитории Maven (и я НЕ хочу устанавливать ее там тоже). Чтобы это скомпилировать, сработало бы что-то вроде этого: добавьте файл jar в проект mylib в папке "lib", например, "lib / thirdpartylib.jar" и в файле mylib pom.xml добавьте зависимость с самостоятельно выбранной группой / артефактом / версией и записью "<scope>system</scope><systemPath>${project.basedir}/lib/thirdpartylib.jar</systemPath>". Проект mylib скомпилируется нормально.

Обратите внимание, что mylib также имеет зависимость во время выполнения от файла dll, скажем Thirdparty.dll. Но для компиляции это не важно.

Однако теперь, что мне интересно, как добиться следующего:

Любые другие проекты, например, Проект "X", который использует mylib, потребует

- mylib.jar
- thirdpartylib.jar
- thirdpartylib.dll

и он должен будет установить java.library.path в каталог (например, ".") Таким образом, чтобы исполняющая виртуальная машина находила сторонние файлы jar и dll.

Мое беспокойство заключается в следующем: я хотел бы, чтобы третьи стороны jar / dll отвечали за проект mylib. То есть Я хочу определить, что вам нужно скопировать jar и dll третьей стороны в целевую папку и что java.library.path ссылается на них, чтобы быть частью проекта mylib (mylib pom знает, как это сделать используется в других проектах). Тем не менее, я хочу, чтобы эти знания (то есть копировать инструкции, независимо от того, как они точно выполняются в Maven) передавались транзитивно в любой другой проект, использующий mylib, например, X. Это как-то возможно?

[Мое хакерское решение на данный момент состояло бы в том, чтобы у меня была копия сторонних вещей в X, но даже тогда я не знаю, как скопировать / обработать файл dll, поэтому мне пришлось бы написать readme, сообщив, что Файл DLL должен быть скопирован в папку bin исполняющей ВМ).

Любые предложения приветствуются!

Ответы [ 2 ]

13 голосов
/ 23 сентября 2011

Я бы предложил превратить файлы в модули Maven, установив их в локальный репозиторий с помощью плагина установки Maven

mvn install:install-file \
    -DgroupId=com.demo \
    -DartifactId=thirdpartylib \
    -Dversion=1.0 \
    -Dfile=thirdpartylib.jar

mvn install:install-file \
    -DgroupId=com.demo \
    -DartifactId=thirdpartylib-runtime \
    -Dversion=1.0 \
    -Dpackaging=dll
    -Dfile=thirdpartylib.dll

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

Проект mylib теперь объявляет сторонние модули как обычные зависимости в своем файле POM:

<dependencies>
    <dependency>
        <groupId>com.demo</groupId>
        <artifactId>thirdpartylib</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>com.demo</groupId>
        <artifactId>thirdpartylib-runtime</artifactId>
        <version>1.0</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Теперь, когда на модуль mylib ссылаются другие модули (как зависимости), модули третьих сторон также будут загружаться как транзитивные зависимости.

2 голосов
/ 22 сентября 2011

Основная идея заключается в следующем:

  • Maven хорош в обработке с одним результатом на POM Maven.
  • Можно иметь библиотеки и зависимости от этих библиотек только в локальных репозиториях.

Итак, вы должны сделать следующие шаги:

  1. Определите для дополнительной библиотеки отдельный проект (или модуль в вашем проекте) и определите библиотеку как результат.
  2. Измените POM так, чтобы теперь это POM зависело от нового проекта.
  3. Сделайте те же шаги для вашей DLL (см. Пост Управление зависимостями DLL с помощью Maven ), как это сделать).
  4. Разверните свою дополнительную библиотеку и свою DLL в своем локальном хранилище.

Теперь вы сможете снова использовать Maven для процесса сборки, а с помощью дополнительных плагинов, таких как maven-assembly-plugin, вы сможете собрать все вместе.

...