Вопрос-ответ

Can I add jars to Maven 2 build classpath without installing them?

Могу ли я добавить 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} .

java