Как добавить локальные файлы jar в проект Maven?
Как добавить локальные файлы jar (еще не являющиеся частью репозитория Maven) непосредственно в источники библиотеки моего проекта?
27 ответов:
установите JAR в локальный репозиторий Maven следующим образом:
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=trueгде каждый относится к:
: путь к файлу для загрузки, например -> c:\kaptcha-2.3.банку
: группа, в которой файл должен быть зарегистрирован под e.g -> com.гуглить.код
: имя артефакта для файла e. g -> kaptcha
: версия файла например - > 2.3
: упаковка файла, например - > jar
вы можете добавить локальные зависимости напрямую (как указано в построить проект maven с библиотеками собственности включены) такой:
<dependency> <groupId>com.sample</groupId> <artifactId>sample</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath> </dependency>
во - первых, я хотел бы отдать должное за этот ответ анонимному пользователю stackoverflow - я уверен, что видел подобный ответ здесь раньше, но теперь я не могу его найти.
лучший вариант для наличия локальных файлов jar в качестве зависимости-создать локальный репозиторий maven. Такое РЕПО-это не что иное, как правильная структура каталогов с файлами pom в ней.
на моем примере: У меня есть мастер-проект на
${master_project}расположение и субпроект1 включен${master_project}/${subproject1}затем я создаю репозиторий mvn в:
${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-repoOnece jar файл установлен такой mvn РЕПО может быть совершен в хранилище кода и вся настройка является независимой от системы. (рабочий пример в github)
Я согласен, что наличие JARs, приверженных РЕПО исходного кода, не является хорошей практикой, но в реальной жизни быстрое и грязное решение иногда лучше чем полномасштабное РЕПО nexus для размещения одной банки, которую вы не можете опубликовать.
создать новую папку, скажем
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]
<dependency> <groupId>group id name</groupId> <artifactId>artifact name</artifactId> <version>version number</version> <scope>system</scope> <systemPath>jar location</systemPath> </dependency>
Я бы хотел такое решение-использовать
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. Теперь этот jar доступен во время любого шага maven на этой машине (не забудьте включить эту зависимость, как и любую другую зависимость maven в pom с<dependency></dependency>tag). Также можно привязать jar install не кinitializeшаг, но любой другой шаг, который вы любите.
Да, вы можете иметь, но его не очень хорошая идея.
вместо этого установите все эти банки в Maven repos
См. Также
один из способов-загрузить его на свой собственный менеджер репозиториев Maven (например Nexus). Это хорошая практика, чтобы иметь собственный менеджер репозитория в любом случае.
еще один хороший способ, который я недавно видел, - это включить плагин Maven Install в свой жизненный цикл сборки: вы объявляете в POM для установки файлов в локальный репозиторий. Это немного, но небольшие накладные расходы и нет ручного шага вовлеченный.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
добавьте свой собственный локальный 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 следующим образом:
конечно, вы можете добавить банки в эту папку. Но, возможно, это не то, чего вы хотите достичь...
Если вам нужны эти банки для компиляции, проверить этот вопрос: могу ли я добавить jars в Maven 2 build classpath без их установки?
кроме того, прежде чем кто-либо предложит это, не используйте область системы.
командная строка :
mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
предпочтительным способом было бы создать свой собственный удаленный репозиторий.
посмотреть здесь подробнее о том, как это сделать. Взгляните на 'загрузка в удаленный репозиторий'.
еще один интересный случай, когда вы хотите иметь в своем проекте частные банки 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 / repository папка и скопировать структуру каталогов проекта вы хотите импортировать в libs.
например, предположим, что вы хотите импортировать зависимость
<dependency> <groupId>com.mycompany.myproject</groupId> <artifactId>myproject</artifactId> <version>1.2.3</version> </dependency>просто продолжай .m2 / repository и вы увидите следующую папку
com/mycompany/myproject / 1.2.3
скопируйте все в папку libs (опять же, включая папки под .m2 / repository), и вы сделали.
действительно быстрый и грязный способ-указать на локальный файл:
<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: местные:
<repositories> <repository> <id>my-local-repo</id> <url>file://C:/DEV//mymvnrepo</url> </repository> </repositories>remote:
<repositories> <repository> <id>my-remote-repo</id> <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url> </repository> </repositories>
также взгляните на...
<scope>compile</scope>Зависимостей Maven. Это значение по умолчанию, но я нашел в некоторых случаях явную настройку этой области также Maven для поиска локальных библиотек в локальном репозитории.
Я хочу поделиться кодом, где вы можете загрузить папку, полную банок. Это полезно, когда поставщик не имеет публичного репозитория, и вам нужно добавить много библиотек вручную. Я решил построить .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(); } }после запуска этого main из любой IDE запустите update_repo_maven.летучая мышь.
Это короткий синтаксис для новых версий:
mvn install:install-file -Dfile=<path-to-file>он работает, когда JAR был построен Apache Maven - наиболее распространенный случай. Тогда он будет содержать пом.xml в подпапке каталога META-INF, который будет считываться по умолчанию.
Источник:http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
обратите внимание, что это не обязательно хорошая идея, чтобы использовать локальный РЕПО. Если этот проект поделится с другими, то у всех остальных будут проблемы и вопросы, когда он не работает, и jar не будет доступен даже в вашей системе управления версиями!
хотя общий РЕПО является лучшим ответом, если вы не можете сделать это по какой-то причине, то вложение jar лучше, чем локальное РЕПО. Локальное содержимое РЕПО может вызвать множество проблем, особенно со временем.
в локальном репозитории вы можете установить jar, выполнив команды
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \ -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>следуйте этим полезным ссылке чтобы сделать то же самое с сайта mkyoung. Вы также можете проверить руководство maven для того же
по какой-то причине в веб-приложении я даю обслуживание, ни решение Алирезы Фаттахи, ни решение JJ Романа правильно работал. В обоих случаях компиляция идет хорошо (он видит банку), но упаковка не включает банку внутри войны.
единственный способ, которым мне удалось заставить его работать, это поставить банку на
/src/main/webapp/WEB-INF/lib/а затем объединить его с решением Фаттаха или Романа.
ЭТОТ ОТВЕТ ТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ECLIPSE:
Если вы используете Eclipse, поместите jar в lib/, щелкните правой кнопкой мыши на имени jar и нажмите "Добавить в путь сборки". Eclipse создаст "ссылочные библиотеки" и разместит банку для вас
Он разрешил импорт jar сразу в программе для меня
чтобы установить стороннюю банку, пожалуйста, вызовите команду, как показано ниже
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
У меня была такая же ошибка для набора зависимостей в моей пом.xml оказывается, версии зависимостей не были указаны в pom.XML и был упомянут в Родительском репозитории. По какой-то причине детали версии не синхронизировались с этим РЕПО. Поэтому я вручную ввел версии с помощью тега, и это сработало как шарм. Немного времени потребовалось, чтобы посмотреть версии в родителе и указать здесь. Но это можно сделать только для банок, которые показывают ошибку artifactid и это работает. Надеюсь, это кому-то поможет.
Я думаю, что лучшим решением этой проблемы является использование maven-install-plugin для автоматической установки файлов во время установки. Вот как я настроил его для моего проекта.
во-первых, добавьте путь (где хранятся местные .банки) в собственность.
<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местные банки будут добавлены автоматически.
- mvn install
вы можете написать код ниже в командной строке или если вы используете eclipse builtin maven щелкните правой кнопкой мыши на project -> Run As -> run Configuration... -> в левой панели щелкните правой кнопкой мыши на Maven Build - > новая конфигурация - > напишите код в целях и в базовом каталоге: ${project_loc: NameOfYourProject} - > Run
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=trueгде каждый относится к:
: путь к файлу чтобы загрузить e. g - > c:\kaptcha-2.3.банку
: группа, в которой файл должен быть зарегистрирован под e.g -> com.гуглить.код
: имя артефакта для файла, например - > kaptcha
: версия файла, например - > 2.3
: упаковка файла, например - > jar
2.После установки, просто объявляет банку в pom.XML.
<dependency> <groupId>com.google.code</groupId> <artifactId>kaptcha</artifactId> <version>2.3</version> </dependency>
в Apache Maven 3.5.4 мне пришлось добавить двойную цитату. Без двойной цитаты это не сработало для меня.
пример: МВН установка:установить файл "единственный способ иметь установленный=место для файла jar" "-DgroupId=ID группы" "-DartifactId=артефакт" идентификатор "-Dversion=версия" "-Dpackaging=тип пакета"
У меня была такая же проблема с 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
