Как добавить локальные файлы jar в проект Maven?
Как добавить локальные файлы jar (еще не являющиеся частью репозитория Maven) непосредственно в источниках моей библиотеки проектов?
Ответы
Ответ 1
Установите JAR в свой локальный репозиторий Maven следующим образом:
mvn install:install-file \
-Dfile=<path-to-file> \
-DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<packaging> \
-DgeneratePom=true
Где каждый ссылается на:
<path-to-file>
: путь к файлу для загрузки, например → c:\kaptcha-2.3.jar
<group-id>
: группа, в которой файл должен быть зарегистрирован, например, под → TG44
.<artifact-id>
: имя артефакта для файла, например, → kaptcha
<version>
: версия файла, например, → 2.3
<packaging>
: упаковка файла, например, → jar
Ссылка
Ответ 2
Вы можете добавить локальные зависимости напрямую (как упоминалось в проекте сборки maven с включенными в него библиотеками) следующим образом:
<dependency>
<groupId>com.sample</groupId>
<artifactId>sample</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/Name_Your_JAR.jar</systemPath>
</dependency>
Обновление
В новых версиях эта функция помечена как устаревшая, но все еще работает и еще не удалена (вы просто видите предупреждение в журнале во время запуска maven). В группе maven возник вопрос об этом https://issues.apache.org/jira/browse/MNG-6523 (Вы можете принять участие и описать, почему эта функция полезна в некоторых случаях). Я надеюсь, что эта функция остается там!
Если вы спрашиваете меня, пока эта функция не удалена, я использую это для создания зависимости только от одного непослушного файла jar в моем проекте, который не помещается в хранилище. Если эта функция будет удалена, то здесь есть много хороших ответов, которые я могу выбрать позже!
Ответ 3
Во-первых, я хотел бы отдать должное этому ответу анонимному пользователю Переполнения стека - я почти уверен, что видел подобный ответ раньше - но сейчас я не могу его найти.
Наилучшим вариантом использования локальных файлов JAR в качестве зависимости является создание локального репозитория Maven. Такой репозиторий - не что иное, как правильная структура каталогов с файлами pom в нем.
Для моего примера: у меня есть мастер-проект в расположении ${master_project}
а subproject1 в ${master_project}/${subproject1}
.
Затем я создаю репозиторий Maven в: ${master_project}/local-maven-repo
.
В файле pom в subproject1, расположенном в ${master_project}/${subproject1}/pom.xml
, необходимо указать хранилище, которое будет принимать путь к файлу в качестве параметра URL:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.parent.basedir}/local-maven-repo</url>
</repository>
</repositories>
Зависимость может быть указана как для любого другого хранилища. Это делает ваш репозиторий POM независимым. Например, как только требуемый JAR будет доступен в Maven Central, вам просто нужно удалить его из локального репо, и он будет извлечен из репо по умолчанию.
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.servicebinder</artifactId>
<version>0.9.0-SNAPSHOT</version>
</dependency>
Последнее, но не менее важное, это добавление файла JAR в локальный репозиторий с помощью переключателя -DlocalRepositoryPath следующим образом:
mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file \
-Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
-DgroupId=org.apache.felix -DartifactId=org.apache.felix.servicebinder \
-Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
-DlocalRepositoryPath=${master_project}/local-maven-repo
После установки файла JAR репозиторий Maven может быть передан в репозиторий кода, и вся установка не зависит от системы. (Рабочий пример в GitHub).
Я согласен с тем, что использование JAR файлов для репо с исходным кодом не является хорошей практикой, но в реальной жизни быстрые и грязные решения иногда лучше, чем полноценное репозиторий Nexus, для размещения одного JAR, который вы не можете опубликовать.
Ответ 4
Создайте новую папку, скажем local-maven-repo
в корне вашего проекта Maven.
Просто добавьте локальное репо внутри <project>
вашего pom.xml
:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.basedir}/local-maven-repo</url>
</repository>
</repositories>
Затем для каждой внешней банки, которую вы хотите установить, зайдите в корень вашего проекта и выполните:
mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]
Ответ 5
Мне хотелось бы такого решения - используйте maven-install-plugin
в файле pom:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>lib/yourJar.jar</file>
<groupId>com.somegroup.id</groupId>
<artifactId>artefact-id</artifactId>
<version>x.y.z</version>
<packaging>jar</packaging>
</configuration>
</execution>
</executions>
</plugin>
В этом случае вы можете выполнить mvn initialize
, а jar будет установлен в локальном репозитории maven. Теперь эта банка доступна во время любого шага maven на этом компьютере (не забудьте включить эту зависимость как любую другую зависимость maven в pom с тегом <dependency></dependency>
). Также возможно связать установку jar не с шагом initialize
, а любым другим шагом, который вам нравится.
Ответ 6
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
Ответ 7
Да, вы можете иметь, но это не очень хорошая идея.
Вместо этого установите все эти банки в maven repos
Также см.
Ответ 8
Один из способов - загрузить его в свой собственный менеджер хранилища Maven (например, Nexus). Хорошая практика иметь собственный менеджер хранилища.
Еще один хороший способ, который я недавно видел, - включить Maven Install Plugin в жизненный цикл сборки: вы объявляете в POM для установки файлов в локальный репозиторий. Это немного, но небольшие накладные расходы и никакого ручного шага.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
Ответ 9
Добавьте свой собственный локальный JAR в файл POM и используйте его в сборке maven.
mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar
Например:
mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-java -Dversion=1.2 -Dpackaging=jar
Затем добавьте его в POM следующим образом:
Ответ 10
Очень быстрый и грязный способ - указать на локальный файл:
<dependency>
<groupId>sample</groupId>
<artifactId>com.sample</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>
Однако это будет жить только на вашей машине (очевидно), для совместного использования обычно имеет смысл использовать собственный архив m2 (nexus/artifactory) или если у вас нет ни одного из них или вы не хотите устанавливать его локальным maven структурированный архив и настроить "репозиторий" в вашем pom: local:
<repositories>
<repository>
<id>my-local-repo</id>
<url>file://C:/DEV//mymvnrepo</url>
</repository>
</repositories>
дистанционный пульт:
<repositories>
<repository>
<id>my-remote-repo</id>
<url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
</repository>
</repositories>
для этого также возможен относительный путь, используя переменную basedir:
<url>file:${basedir}</url>
Ответ 11
Конечно, вы можете добавить банки в эту папку. Но, возможно, это не то, что вы хотите достичь...
Если вам нужны эти банки для компиляции, проверьте этот связанный вопрос: Могу ли я добавить банки в maven 2 build classpath без их установки?
Кроме того, прежде чем кто-либо подскажет это, НЕ используйте системную область.
Ответ 12
:
mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
Ответ 13
Еще один интересный случай - когда вы хотите иметь в своем проекте частные банки maven. Возможно, вы захотите сохранить возможности Maven для разрешения транзитивных зависимостей. Решение довольно просто.
- Создайте папку libs в своем проекте
-
Добавьте следующие строки в файл pom.xml
<properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
</properties>
<repositories>
<repository>
<id>local-maven-repository</id>
<url>file://${local.repository.folder}</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
-
Откройте папку .m2/репозиторий и скопируйте структуру каталогов проекта, который вы хотите импортировать, в папку libs.
например. предположим, что вы хотите импортировать зависимость
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject</artifactId>
<version>1.2.3</version>
</dependency>
Просто запустите .m2/репозиторий, и вы увидите следующую папку
ком /MyCompany/MyProject/ 1.2.3
Скопируйте все в папку libs (опять же, включая папки под .m2/репозиторий), и все готово.
Ответ 14
Предпочтительным способом было бы создать собственный удаленный репозиторий.
Подробнее о том, как это сделать, см. здесь.
Посмотрите раздел Загрузка в удаленный репозиторий.
Ответ 15
Я думаю, что лучшим решением этой проблемы является использование maven-install-plugin для автоматической установки файлов во время установки. Вот как я настроил его для своего проекта.
Сначала добавьте путь (где вы храните локальные.jars) в качестве свойства.
<properties>
<local.sdk>/path/to/jar</local.sdk>
</properties>
Затем под plugins
добавьте плагин для установки баннеров при компиляции.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>1</id>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${local.sdk}/lib/impl/appengine-api.jar</file>
</configuration>
</execution>
<execution>
<id>appengine-api-stubs</id>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
</configuration>
</execution>
</executions>
</plugin>
Наконец, в зависимостях вы можете добавить банки
<dependency>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
Создав свой проект таким образом, проект продолжит работу, даже если вы перейдете на другой компьютер (учитывая, что он имеет все файлы jar в пути, указанном свойством local.sdk
).
Для groupId
используйте уникальное имя, чтобы убедиться, что конфликтов нет.
Теперь, когда вы mvn install
или mvn test
локальные банки автоматически добавляются.
Ответ 16
Также взгляните на...
<scope>compile</scope>
Зависимости Maven. Это значение по умолчанию, но я обнаружил, что в некоторых случаях явным образом устанавливаю эту область также Maven для поиска локальных библиотек в локальном репозитории.
Ответ 17
Я хочу поделиться кодом, в котором вы можете загрузить папку с банками. Это полезно, когда у провайдера нет общего репозитория, и вам нужно добавить много библиотек вручную. Я решил построить .bat вместо вызова непосредственно в maven, потому что это могут быть ошибки из памяти. Он был подготовлен для среды Windows, но легко адаптировать его к ОС Linux:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
public class CreateMavenRepoApp {
private static final String OCB_PLUGIN_FOLDER = "C://your_folder_with_jars";
public static void main(String[] args) throws IOException {
File directory = new File();
//get all the files from a directory
PrintWriter writer = new PrintWriter("update_repo_maven.bat", "UTF-8");
writer.println("rem "+ new Date());
File[] fList = directory.listFiles();
for (File file : fList){
if (file.isFile()){
String absolutePath = file.getAbsolutePath() ;
Manifest m = new JarFile(absolutePath).getManifest();
Attributes attributes = m.getMainAttributes();
String symbolicName = attributes.getValue("Bundle-SymbolicName");
if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
String[] parts =symbolicName.split("\\.");
String artifactId = parts[parts.length-1];
String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
String version = attributes.getValue("Bundle-Version");
String mavenLine= "call mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar ";
writer.println(mavenLine);
}
}
}
writer.close();
}
}
После запуска этой основной из любой среды IDE запустите update_repo_maven.bat.
Ответ 18
Это короткий синтаксис для более новых версий:
mvn install:install-file -Dfile=<path-to-file>
Это работает, когда JAR был создан Apache Maven - наиболее распространенным случаем. Затем он будет содержать pom.xml в подпапке каталога META-INF, который будет считаться по умолчанию.
Источник: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
Ответ 19
Обратите внимание, что не обязательно использовать локальное репо.
Если этот проект делится с другими, тогда у всех остальных будут проблемы и вопросы, когда он не будет работать, и банка будет недоступна даже в вашей системе управления версиями!
Хотя общий репо - лучший ответ, если вы не можете сделать это по какой-то причине, тогда встраивание фляги лучше, чем локальное репо. Локальное содержимое репо может вызвать множество проблем, особенно с течением времени.
Ответ 20
В вашем локальном репозитории вы можете установить свою банку, выпустив команды
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
Следуйте этой полезной ссылке, чтобы сделать то же самое с сайта mkyoung. Вы также можете проверить руководство maven для того же
Ответ 21
По какой-то причине в веб-приложении я поддерживаю обслуживание, а не решение Aliraza Fattahi и решение JJ Roman работал правильно. В обоих случаях компиляция идет хорошо (она видит банку), но упаковка не включает флягу в войну.
Единственный способ, которым мне удалось это сделать, - положить банку на /src/main/webapp/WEB-INF/lib/
, а затем объединить ее с решением Fattahis или Roman.
Ответ 22
НАСТОЯЩИЙ ОТВЕТ ТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ECLIPSE:
Если вы используете Eclipse, поместите jar в lib/, щелкните правой кнопкой мыши по имени jar и нажмите "add to build path".
Eclipse создаст "ссылки библиотек" и разместит банку для вас
Он разрешил импорт банки сразу в программе для меня
Ответ 23
Чтобы установить стороннюю банку, пожалуйста, вызовите команду, как показано ниже
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
Ответ 24
Использование maven-install-plugin в родительском помпе или синтетическом родительском pom работает для меня. Скажем, мы помещаем файл jar в каталог lib родительского модуля, нам просто нужно создать свойство как lib-path:
- lib-path: ${project-basedir}/lib для родительского pom
- lib-path: {project.parent.basedir}/lib из любого дополнительного модуля
Далее следует, что @sphinks описывает его выше, используя maven-install-plugin. Не будет никакого ручного шага, и артефакт может быть добавлен как любые другие зависимости к вспомогательному модулю.
NB. Вы можете также использовать некоторые плагины для исправления папки lib. Некоторые предлагают использовать Maven Directory Plugin
Ответ 25
У меня была такая же ошибка для набора зависимостей в моем pom.xml, что версии зависимостей не были указаны в pom.xml и упоминались в родительском репозитории. По какой-то причине сведения о версии не синхронизировались с этим репо. Следовательно, я вручную ввел версии с использованием тега, и он работал как шарм. Немного времени, необходимого для поиска версий в родительском и укажите здесь. Но это можно сделать только для банок, которые показывают артефактную ошибку, и это работает. Надеюсь, это поможет кому-то.
Ответ 26
- mvn install
Вы можете написать код ниже в командной строке или если вы используете eclipse builtin maven, щелкните правой кнопкой мыши по проекту → Run As → run configurations... → в левой панели правой кнопкой мыши на Maven Build → new configuration → напишите код в Goals & in base directory: $ {project_loc: NameOfYourProject} → Run
mvn install:install-file
-Dfile=<path-to-file>
-DgroupId=<group-id>
-DartifactId=<artifact-id>
-Dversion=<version>
-Dpackaging=<packaging>
-DgeneratePom=true
Где каждый относится к:
<путь к файлу>: путь к файлу для загрузки, например → c:\kaptcha-2.3.jar
<group-id>: группа, в которой файл должен быть зарегистрирован, например, → com.google.code
<artifact-id>: имя артефакта для файла, например → kaptcha
<версия>: версия файла eg → 2.3
<упаковка>: упаковка файла, например → jar
2. После установки просто объявляет jar в pom.xml.
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>
Ответ 27
В Apache Maven 3.5.4 мне пришлось добавить двойную цитату. Без двойной цитаты это не сработало для меня.
Пример: mvn install: install-file "-Dfile = расположение файла jar" "-DgroupId = идентификатор группы" "-DartifactId = артефакт id" "-Dversion = версия" "-Dpackaging = тип пакета"
Ответ 28
У меня была такая же проблема с ojdbc6. Я видел эту ссылку, но она не работала. Команда была правильной, но мне нужен был еще один параметр,
Это ссылка: http://roufid.com/3-ways-to-add-local-jar-to-maven-project/
Вот пример:
install:install-file -Dfile=C:\driversDB\ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar