Maven2 сводит меня с ума во время фазы эксперимента / быстрого и грязного макета разработки.
У меня есть pom.xml
файл, который определяет зависимости для инфраструктуры веб-приложений, которую я хочу использовать, и я могу быстро сгенерировать стартовые проекты из этого файла. Однако иногда я хочу ссылаться на стороннюю библиотеку, в которой еще не определен pom.xml
файл, поэтому вместо того, чтобы pom.xml
вручную создавать файл для сторонней библиотеки lib, устанавливать его и добавлять зависимость к моей pom.xml
, я просто хотел бы сказать Maven: «В дополнение к моим определенным зависимостям, включите все jar-файлы, которые /lib
тоже есть».
Кажется, это должно быть просто, но если это так, я что-то упускаю.
Любые указатели о том, как это сделать, с благодарностью. Если не считать этого, если есть простой способ указать maven на /lib
каталог и легко создать файл pom.xml
со всеми вложенными jar-файлами, сопоставленными с одной зависимостью, которую я мог бы затем назвать / установить и ссылаться на нее одним махом, этого также было бы достаточно.
Ответы:
Проблемы популярных подходов
Большинство ответов, которые вы найдете в Интернете, предложат вам либо установить зависимость в вашем локальном репозитории, либо указать «системную» область действия в
pom
и распределить зависимость с источником вашего проекта. Но оба эти решения на самом деле несовершенны.Почему вы не должны применять подход «Install to Local Repo»
Когда вы устанавливаете зависимость в свой локальный репозиторий, он остается там. С вашим артефактом распространения все будет хорошо, если у него есть доступ к этому хранилищу. Проблема в том, что в большинстве случаев этот репозиторий будет находиться на вашем локальном компьютере, поэтому не будет никакого способа разрешить эту зависимость на любом другом компьютере. Очевидно, что зависимость вашего артефакта от конкретной машины - это не способ справиться с ситуацией. В противном случае эта зависимость должна быть установлена локально на каждой машине, работающей с этим проектом, что не лучше.
Почему вы не должны применять подход «Scope System»
Банки, от которых зависит подход System Scope, не устанавливаются ни в какое хранилище и не подключаются к целевым пакетам. Вот почему в вашем дистрибутиве не будет способа разрешить эту зависимость при использовании. Именно это, я считаю, и стало причиной того, что использование системной области даже устарело. В любом случае, вы не хотите полагаться на устаревшую функцию.
Статическое решение для репозитория в проекте
После размещения этого в вашем
pom
:для каждого артефакта с групповым идентификатором формы
x.y.z
Maven будет включать следующее местоположение в директории вашего проекта при поиске артефактов:Подробнее об этом вы можете прочитать в этом блоге .
Используйте Maven для установки в репозиторий проекта
Вместо того, чтобы создавать эту структуру вручную, я рекомендую использовать плагин Maven для установки ваших jar-файлов в качестве артефактов. Итак, чтобы установить артефакт в репозиторий в проекте в
repo
папке выполните:Если вы выберете этот подход, вы сможете упростить объявление репозитория
pom
до:Вспомогательный скрипт
Поскольку выполнение команды установки для каждой библиотеки является довольно раздражающим и определенно подверженным ошибкам, я создал служебный сценарий, который автоматически устанавливает все
lib
файлы jar из папки в репозиторий проекта, одновременно автоматически обрабатывая все метаданные (groupId, artifactId и т. Д.) Из имена файлов. Сценарий также распечатывает xml-зависимости, которые вы можете скопировать и вставить в свойpom
.Включите зависимости в ваш целевой пакет
Когда вы создадите свой репозиторий в проекте, вы решите проблему распределения зависимостей проекта с его источником, но с тех пор целевой артефакт вашего проекта будет зависеть от неопубликованных jar-файлов, поэтому при установке у этого хранилища будут неразрешимые зависимости.
Чтобы решить эту проблему, я предлагаю включить эти зависимости в ваш целевой пакет. Это вы можете сделать либо с плагином сборки, либо лучше с плагином OneJar . Официальную документацию по OneJar легко понять.
источник
Только для выброшенного кода
установить область видимости системы == и просто создать идентификатор группы, идентификатор артефакта и версию
Примечание: системные зависимости не копируются в полученный jar / war
(см. Как включить системные зависимости в войну, созданную с использованием maven )
источник
system
прицела - это ужасная практика, которая настоятельно не рекомендуется . См. Зависимость + Области .Вы можете создать локальный репозиторий на вашем проекте
Например, если у вас есть
libs
папка в структуре проектаВ
libs
папке вы должны создать структуру каталогов, например:/groupId/artifactId/version/artifactId-version.jar
В вашем pom.xml вы должны зарегистрировать репозиторий
и добавить зависимость как обычно
Это все.
Для получения подробной информации: Как добавить внешние библиотеки в Maven
источник
Примечание. При использовании области действия системы ( как упомянуто на этой странице ) Maven нужны абсолютные пути.
Если ваши файлы находятся в корне вашего проекта, вам нужно добавить префикс значений systemPath к $ {basedir}.
источник
Это то, что я сделал, он также работает с проблемой пакета и работает с проверенным кодом.
Я создал новую папку в проекте, в моем случае я использовал
repo
, но не стесняйтесь использоватьsrc/repo
В моем POM у меня была зависимость, которой нет ни в одном публичном репозитории maven
Затем я создал следующие каталоги
repo/com/dovetail/zoslog4j/1.0.1
и скопировал файл JAR в эту папку.Я создал следующий файл POM для представления загруженного файла (этот шаг не является обязательным, но он удаляет ПРЕДУПРЕЖДЕНИЕ) и помогает следующему парню выяснить, откуда у меня файл для начала.
Два дополнительных файла, которые я создаю, - это контрольные суммы SHA1 для POM и JAR, чтобы удалить предупреждения о пропущенной контрольной сумме.
Наконец, я добавляю следующий фрагмент в мой pom.xml, который позволяет мне ссылаться на локальный репозиторий
источник
Вы действительно должны установить фреймворк через репозиторий и заранее определить ваши зависимости. Использование системной области является распространенной ошибкой, которую используют люди, потому что они «не заботятся об управлении зависимостями». Проблема в том, что, делая это, вы получаете извращенную сборку maven, которая не будет отображать maven в нормальном состоянии. Вы бы лучше следующий подход , как это .
источник
Вот так мы добавляем или устанавливаем локальный jar
я дал некоторые значения по умолчанию groupId и artifactId, потому что они являются обязательными :)
источник
Плагин установки Maven использует командную строку для установки jar в локальный репозиторий, POM является необязательным, но вам нужно будет указать GroupId, ArtifactId, Version и Packaging (все содержимое POM).
источник
Использование
<scope>system</scope>
- ужасная идея по причинам, объясненным другими, установка файла вручную в локальный репозиторий делает сборку невоспроизводимой, и использование также<url>file://${project.basedir}/repo</url>
не является хорошей идеей, потому что (1) это может быть не правильно сформированныйfile
URL (например, если проект отмечен в каталоге с необычными символами), (2) результат не может быть использован, если POM этого проекта используется в качестве зависимости от проекта другого пользователя.Предполагая, что вы не хотите загружать артефакт в публичный репозиторий, предложение Симеона о вспомогательном модуле делает эту работу. Но теперь есть более легкий путь ...
Рекомендация
Используйте non-maven-jar-maven-plugin . Делает именно то, что вы просили, без каких-либо недостатков других подходов.
источник
Я нашел другой способ сделать это, см. Здесь из сообщения Heroku
Подводя итог (извините за некоторые скопировать и вставить)
repo
каталог в корневой папке:pom.xml
:источник
После долгого обсуждения с ребятами из CloudBees правильной упаковки таких JAR-файлов они сделали интересное хорошее предложение для решения:
Создание фальшивого проекта Maven, который присоединяет ранее существовавший JAR в качестве основного артефакта и запускается в принадлежащую установку POM: выполнение установочного файла. Вот пример такого рода POM:
Но для его реализации необходимо изменить существующую структуру проекта. Во-первых, вы должны иметь в виду, что для каждого такого JAR-файла должен быть создан отдельный поддельный проект Maven (модуль). И должен быть создан родительский проект Maven, включающий все подмодули, а именно: все оболочки JAR и существующий основной проект. Структура может быть:
Когда родительский процесс выполняется через mvn: install или mvn: package принудительно, и субмодули будут выполнены. Это может рассматриваться как минус, так как структура проекта должна быть изменена, но в конце предлагает нестатическое решение.
источник
Что мне кажется самым простым, так это просто настроить плагин maven-compiler-plugin, чтобы он включал ваши пользовательские файлы jar. Этот пример загрузит любые файлы jar в каталог lib.
источник
says nothing to complile
!all classes are up to date
nothing to compile
потому что больше не будет искать*.java
. Вы можете добавить их обратно, используя<include>**/*.java</include>
. Пока что у меня нет успеха для банокПроблема
systemPath
в том, что банки зависимостей не будут распределяться по вашим артефактам как транзитивные зависимости. Попробуйте то, что я написал здесь: лучше ли Mavenize файлы вашего проекта JAR или поместить их в WEB-INF / lib?Затем объявите зависимости как обычно.
И, пожалуйста, прочитайте примечание нижнего колонтитула.
источник
Странное решение я нашел:
используя Eclipse
ура, Балинт
источник
Если вы хотите быстрое и грязное решение, вы можете сделать следующее (хотя я не рекомендую это ни для чего, кроме тестовых проектов, maven долго будет жаловаться, что это не правильно).
Добавьте запись о зависимости для каждого необходимого вам jar-файла, желательно с помощью perl-скрипта или чего-то подобного, и скопируйте / вставьте его в ваш pom-файл.
источник
Быстрое и грязное решение партии ( на основе ответа Алекса):
libs.bat
Выполнить это так:
libs.bat > libs.txt
. Затем откройтеlibs.txt
и скопируйте его содержимое как зависимости.В моем случае мне нужны были только библиотеки для компиляции моего кода, и это решение было лучшим для этой цели.
источник
Даже если это не совсем подходит к вашей проблеме, я опущу это здесь. Мои требования были:
Давайте сначала поговорим о (3): просто не будет работать с банками в папке и как-то объединять их в финальную банку, поскольку среда IDE не поймет этого. Это означает, что все библиотеки должны быть установлены правильно. Однако я не хочу, чтобы все устанавливали его с помощью "mvn install-file".
В моем проекте мне понадобился мета-виджет. Вот так:
Каждый раз, когда у вас появляется новая библиотека, просто добавьте новое исполнение и скажите всем, что вам нужно построить проект заново (вы можете улучшить этот процесс с помощью иерархий проектов).
источник
Чтобы установить сторонний jar, которого нет в репозитории maven, используйте maven-install-plugin.
Ниже приведены шаги:
Ниже приведен пример, который я использовал для simonsite log4j
В pom.xml включите зависимость как показано ниже
Запустите команду mvn clean install, чтобы создать упаковку
Ниже ссылка ссылка:
https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
источник
Для тех, кто не нашел здесь хорошего ответа, это то, что мы делаем, чтобы получить банку со всеми необходимыми зависимостями. В этом ответе ( https://stackoverflow.com/a/7623805/1084306 ) упоминается использование подключаемого модуля Maven Assembly, но в действительности не приводится пример ответа. И если вы не прочитали весь путь до конца ответа (он довольно длинный), вы можете пропустить его. Добавление ниже к вашему pom.xml сгенерирует
target/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar
источник
Я сослался на некоторый код на python в комментарии к ответу @alex lehmann's, поэтому выкладываю его здесь.
источник
Это не ответ на вопрос, как добавить их к вашему POM, и, может быть, не представляет никакой сложности, но просто добавит lib dir к вашей работе с classpath? Я знаю, что это то, что я делаю, когда мне нужна внешняя банка, которую я не хочу добавлять в свои репозитории Maven.
Надеюсь это поможет.
источник
В нашем проекте работает то, что написал Архимед Траяно, но в нашем файле .m2 / settings.xml было что-то вроде этого:
и * следует изменить на центральный. Так что, если его ответ не работает для вас, вы должны проверить ваши settings.xml
источник
Я просто хотел быстрый и грязный обходной путь ... Я не мог запустить скрипт от Никиты Волкова: синтаксическая ошибка + требуется строгий формат для имен банок.
Я сделал этот Perl-скрипт, который работает с любым форматом для имен файлов jar, и он генерирует зависимости в xml, чтобы его можно было копировать и вставлять непосредственно в pom.
Если вы хотите использовать его, убедитесь, что вы понимаете, что делает скрипт, вам может потребоваться изменить
lib
папку и значение дляgroupId
илиartifactId
...источник
Решение для подхода scope = 'system' в Java:
источник