Могу ли я добавить jar в Maven 2 build classpath без их установки?
Maven 2 сводит меня с ума на этапе экспериментов / быстрого и грязного макета разработки.
У меня есть pom.xml
файл, который определяет зависимости для фреймворка веб-приложения, который я хочу использовать, и я могу быстро создавать начальные проекты из этого файла. Однако иногда я хочу создать ссылку на стороннюю библиотеку, в которой еще не определен pom.xml
файл, поэтому вместо того, чтобы создавать pom.xml
файл для сторонней библиотеки вручную и устанавливать его, а также добавлять зависимости в свою pom.xml
, я просто хотел бы сказать Maven: "В дополнение к моим определенным зависимостям, включите любые jar, которые также есть в /lib
".
Кажется, что это должно быть просто, но если это так, я чего-то не понимаю.
Любые указания о том, как это сделать, очень ценятся. Кроме того, если есть простой способ указать maven на /lib
каталог и легко создать pom.xml
со всеми вложенными jar, сопоставленными с одной зависимостью, которую я затем мог бы назвать / установить и связать с одним махом, также было бы достаточно.
Переведено автоматически
Ответ 1
Проблемы популярных подходов
Большинство ответов, которые вы найдете в Интернете, предложат вам либо установить зависимость в свой локальный репозиторий, либо указать область "system" в pom
и распространить зависимость с исходным кодом вашего проекта. Но оба этих решения на самом деле имеют недостатки.
Почему вы не должны применять подход "Установить в локальное хранилище"
Когда вы устанавливаете зависимость в свой локальный репозиторий, она остается там. Ваш артефакт дистрибутива будет работать нормально, пока у него есть доступ к этому репозиторию. Проблема в том, что в большинстве случаев этот репозиторий будет находиться на вашем локальном компьютере, поэтому не будет способа разрешить эту зависимость на любом другом компьютере. Очевидно, что зависимость вашего артефакта от конкретной машины - это не способ справиться с ситуацией. В противном случае эту зависимость придется устанавливать локально на каждой машине, работающей с этим проектом, который ничуть не лучше.
Почему вы не должны применять подход "Системной области"
JAR, от которых вы зависите при использовании подхода "Системной области", не устанавливаются ни в какой репозиторий и не прикрепляются к вашим целевым пакетам. Вот почему в вашем дистрибутиве не будет способа разрешить эту зависимость при использовании. Я полагаю, что это стало причиной того, что использование system scope даже устарело. В любом случае, вы не хотите полагаться на устаревшую функцию.
Решение для статического репозитория в проекте
После размещения этого в вашем pom
:
<repository>
<id>repo</id>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>file://${project.basedir}/repo</url>
</repository>
для каждого артефакта с идентификатором группы формы x.y.z
Maven будет указывать следующее местоположение внутри каталога вашего проекта при поиске артефактов:
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
Подробнее об этом вы можете прочитать этот пост в блоге.
Используйте Maven для установки в репозиторий проекта
Вместо создания этой структуры вручную я рекомендую использовать плагин Maven для установки ваших jar в качестве артефактов. Итак, чтобы установить артефакт во внутренний репозиторий проекта в repo
папке execute:
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]
Если вы выберете этот подход, вы сможете упростить объявление репозитория в pom
to:
<repository>
<id>repo</id>
<url>file://${project.basedir}/repo</url>
</repository>
Вспомогательный скрипт
Поскольку выполнение команды установки для каждой библиотеки немного раздражает и определенно подвержено ошибкам, я создал служебный скрипт, который автоматически устанавливает все jar из lib
папки в репозиторий проекта, автоматически разрешая все метаданные (groupId, artifactId и т.д.) Из имен файлов. Скрипт также распечатывает xml зависимостей, чтобы вы могли скопировать и вставить их в свой pom
.
Включите зависимости в ваш целевой пакет
Когда вы создадите свой репозиторий внутри проекта, вы решите проблему распространения зависимостей проекта с его исходным кодом, но с тех пор целевой артефакт вашего проекта будет зависеть от неопубликованных jar, поэтому, когда вы установите его в репозиторий, у него будут неразрешимые зависимости.
Чтобы решить эту проблему, я предлагаю включить эти зависимости в ваш целевой пакет. Это вы можете сделать либо с помощью Assembly Plugin, либо лучше с помощью OneJar Plugin. Официальную документацию по OneJar легко понять.
Ответ 2
Только для выброшенного кода
установите scope == system и просто создайте groupId, artifactId и version
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>swingx</artifactId>
<version>0.9.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>
Примечание: системные зависимости не копируются в результирующий jar / war
(см. Как включить системные зависимости в war, созданный с использованием maven)
Ответ 3
Вы можете создать локальный репозиторий в своем проекте
Например, если у вас есть libs
папка в структуре проекта
В
libs
папке вы должны создать структуру каталогов, подобную:/groupId/artifactId/version/artifactId-version.jar
В вашем pom.xml вы должны зарегистрировать репозиторий
<repository>
<id>ProjectRepo</id>
<name>ProjectRepo</name>
<url>file://${project.basedir}/libs</url>
</repository>и добавить зависимость как обычно
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
</dependency>
Вот и все.
Для получения подробной информации: Как добавить внешние библиотеки в Maven (архивировано)
Ответ 4
Примечание: При использовании системной области видимости (как указано на этой странице) Maven требуются абсолютные пути.
Если ваши jar-файлы находятся в корневом каталоге вашего проекта, вы захотите добавить к своим значениям systemPath префикс ${basedir} .