Как добавить локальные файлы 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
где каждый ссылается на:
: путь к файлу для загрузки e.g - > c:\kaptcha-2.3 - ... Джар
: группа, в которой файл должен быть зарегистрирован под e.G - > com.гуглить.код
: имя артефакта для файла e.g - > капча
: версия файла e.g - > 2.3
: упаковка файла, например - > jar
вы можете добавлять локальные зависимости напрямую (как указано в создать проект Maven с библиотеками propriatery входит) такой:
<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}
местоположение и subroject1 включен ${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>
зависимость может быть задана как для любого другого репозитория. Это делает ваш репозиторий пом независимой. Например, как только желаемый 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
Onece jar файл установлен такой mvn РЕПО может быть совершен в хранилище кода и вся настройка не зависит от системы. (рабочий пример в github)
Я согласен, что наличие банок, связанных с РЕПО исходного кода, не является хорошей практикой, но в реальной жизни быстрое и грязное решение иногда лучше чем полномасштабное РЕПО 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. Теперь эта банка доступна во время любого шага 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 build.
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 следующим образом:
конечно, вы можете добавить банки в эту папку. Но, возможно, это не то, чего вы хотите достичь...
Если вам нужны эти банки для компиляции, проверить этот вопрос: могу ли я добавить банки в 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 руководство для того же
по какой-то причине в веб-приложении, которому я предоставляю обслуживание, ни решение Алирезы Фаттахи, ни й Роман!--3--> правильно работал. В обоих случаях компиляция идет хорошо (она видит банку), но упаковка не включает банку внутри войны.
единственный способ заставить его работать-поставить банку на /src/main/webapp/WEB-INF/lib/
а затем объединить его с решением Фаттахиса или Романа.
ЭТОТ ОТВЕТ ПРЕДНАЗНАЧЕН ТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ECLIPSE:
Если вы используете Eclipse, поместите банку в lib/, щелкните правой кнопкой мыши на имени банки и нажмите "Добавить в путь сборки". Eclipse создаст "ссылочные библиотеки" и разместит банку для вас
это разрешило импорт банки сразу в программе для меня
чтобы установить стороннюю банку, пожалуйста, вызовите команду, как показано ниже
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
У меня была такая же ошибка для набора зависимостей в моей пом.xml оказывается, что версии зависимостей не были указаны в pom.XML и был упомянут в Родительском репозитории. По какой-то причине детали версии не синхронизировались с этим РЕПО. Поэтому я вручную ввел версии, используя тег, и он работал как шарм. Немного времени, необходимого для поиска версий в родителе и указать здесь. Но это можно сделать только для банок, которые показывают ошибку artifactid и это работает. Надеюсь, это кому-то поможет.
Я думаю, что лучшим решением этой проблемы является использование 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
местные банки будут добавлены автоматически.
- mvn установить
вы можете написать код ниже в командной строке или если вы используете eclipse builtin maven щелкните правой кнопкой мыши на project -> Run As -> run Configuration... - >в левой панели щелкните правой кнопкой мыши на Maven Build - > новая конфигурация - > напишите код в 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
где каждый ссылается на:
: путь к файлу для загрузки e.g - > c:\kaptcha-2.3 - ... Джар
: группа, в которой файл должен быть зарегистрирован под e.G - > com.гуглить.код
: имя артефакта для файла e.g - > капча
: версия файла e.g - > 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