Как добавить локальные файлы jar (еще не являющиеся частью репозитория Maven) непосредственно в источниках моей библиотеки проектов?
Установите 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.jar
<идентификатор группы>: группа, в которой файл должен быть зарегистрирован, например, → com.google.code
<идентификатор артефакта>: имя артефакта для файла, например → капча
<версия>: версия файла, например → 2.3
<упаковка>: упаковка файла, например → банка
Вы можете добавить локальные зависимости напрямую (как упоминалось в проекте build 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>
Обновить
В новых выпусках эта функция помечена как устаревшая, но все еще работает и еще не удалена (вы просто видите предупреждение в журнале при запуске maven). В группе maven возник вопрос об этом https://issues.apache.org/jira/browse/MNG-6523 (Вы можете принять участие и описать, почему эта функция полезна в некоторых случаях). Я надеюсь, что эта функция остается там!
Если вы спрашиваете меня, пока эта функция не удалена, я использую это для создания зависимости только от одного непослушного файла JAR в моем проекте, который не помещается в репозиторий. Если эта функция будет удалена, то здесь есть много хороших ответов, которые я могу выбрать позже!
<systemPath>
предлагает папку в проекте. Имеет ли смысл хранить такие банки в папке, внешней по отношению к проекту? Вроде как маленький псевдо-репозиторий. Я предполагаю, что Maven вытягивает копию банки из такой внешней папки.
Во-первых, я хотел бы отдать должное этому анонимному пользователю stackoverflow - я уверен, что раньше видел аналогичный ответ, но теперь я не могу его найти.
Лучшим вариантом для локальных файлов jar в качестве зависимости является создание локального репозитория maven. Такое репо - это не что иное, как правильная структура каталогов с файлами pom.
В моем примере:
У меня есть мастер-проект в ${master_project}
, а subroject1 находится на ${master_project}/${subproject1}
то я создаю mvn-репозиторий в:
${master_project}/local-maven-repo
В файле pom в подпроекте 1 находится репозиторий ${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 независимым. Например, если желаемая банка доступна в центральном центре maven, вам просто нужно удалить ее из своего локального репо, и она будет вытащена из репо по умолчанию.
<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 файла установлен таким образом, что mvn-репо может быть привязано к репозиторию кода, а вся настройка независима от системы. (рабочий пример в github)
Я согласен с тем, что использование JAR для репо-кода исходного кода не является хорошей практикой, но в реальной жизни быстрое и грязное решение иногда лучше, чем полномасштабное переключение нексуса, чтобы разместить одну банку, которую вы не можете опубликовать.
Создайте новую папку, скажем 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>
<scope>system
устарела.
Мне хотелось бы такого решения - используйте 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
, а любым другим шагом, который вам нравится.
mvn initialize
перед mvn package
: я не могу mvn initialize package
иначе он пытается загрузить JAR из центрального репозитория. Почему это? Я думал, что это будет запускать эти цели / фазы в порядке.
Да, вы можете иметь, но это не очень хорошая идея.
Вместо этого установите все эти банки в maven repos
Также см.
Один из способов - загрузить его в свой собственный менеджер хранилища Maven (например, Nexus). Хорошая практика иметь собственный менеджер хранилища.
Еще один хороший способ, который я недавно видел, - включить Maven Install Plugin в жизненный цикл сборки: вы объявляете в 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 следующим образом:
Очень быстрый и грязный способ - указать на локальный файл:
<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>
Конечно, вы можете добавить банки в эту папку. Но, возможно, это не то, что вы хотите достичь...
Если вам нужны эти банки для компиляции, проверьте этот связанный вопрос: Могу ли я добавить банки в 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 для разрешения транзитивных зависимостей. Решение довольно просто.
Добавьте следующие строки в файл 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/репозиторий), и все готово.
Предпочтительным способом было бы создать собственный удаленный репозиторий.
Подробнее о том, как это сделать, см. здесь. Посмотрите раздел Загрузка в удаленный репозиторий.
Это короткий синтаксис для более новых версий:
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
Я хочу поделиться кодом, в котором вы можете загрузить папку с банками. Это полезно, когда у провайдера нет общего репозитория, и вам нужно добавить много библиотек вручную. Я решил построить .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.
String symbolicName = attributes.getValue("Bundle-SymbolicName"); if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject"))
указывает на то, что будут поддерживаться только пользовательские String symbolicName = attributes.getValue("Bundle-SymbolicName"); if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject"))
. Это не то, что нам нужно: вместо этого куча банок сторонних производителей. У вас есть предложения, как установить любую банку таким способом?
Также взгляните на...
<scope>compile</scope>
Зависимости Maven. Это значение по умолчанию, но я обнаружил, что в некоторых случаях явным образом устанавливаю эту область также Maven для поиска локальных библиотек в локальном репозитории.
Я думаю, что лучшим решением этой проблемы является использование 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
локальные банки автоматически добавляются.
По какой-то причине в веб-приложении я поддерживаю обслуживание, а не решение Aliraza Fattahi и решение JJ Roman работал правильно. В обоих случаях компиляция идет хорошо (она видит банку), но упаковка не включает флягу в войну.
Единственный способ, которым мне удалось это сделать, - положить банку на /src/main/webapp/WEB-INF/lib/
, а затем объединить ее с решением Fattahis или Roman.
В вашем локальном репозитории вы можете установить свою банку, выпустив команды
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
Следуйте этой полезной ссылке, чтобы сделать то же самое с сайта mkyoung. Вы также можете проверить руководство maven для того же
Обратите внимание, что не обязательно использовать локальное репо. Если этот проект делится с другими, тогда у всех остальных будут проблемы и вопросы, когда он не будет работать, и банка будет недоступна даже в вашей системе управления версиями!
Хотя общий репо - лучший ответ, если вы не можете сделать это по какой-то причине, тогда встраивание фляги лучше, чем локальное репо. Локальное содержимое репо может вызвать множество проблем, особенно с течением времени.
В Apache Maven 3.5.4 мне пришлось добавить двойную цитату. Без двойной цитаты это не сработало для меня.
Пример: mvn install: install-file "-Dfile = расположение файла jar" "-DgroupId = идентификатор группы" "-DartifactId = артефакт id" "-Dversion = версия" "-Dpackaging = тип пакета"
- 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>
У меня была такая же ошибка для набора зависимостей в моем pom.xml, что версии зависимостей не были указаны в pom.xml и упоминались в родительском репозитории. По какой-то причине сведения о версии не синхронизировались с этим репо. Следовательно, я вручную ввел версии с использованием тега, и он работал как шарм. Немного времени, необходимого для поиска версий в родительском и укажите здесь. Но это можно сделать только для банок, которые показывают артефактную ошибку, и это работает. Надеюсь, это поможет кому-то.
Использование maven-install-plugin в родительском помпе или синтетическом родительском pom работает для меня. Скажем, мы помещаем файл jar в каталог lib родительского модуля, нам просто нужно создать свойство как lib-path:
Далее следует, что @sphinks описывает его выше, используя maven-install-plugin. Не будет никакого ручного шага, и артефакт может быть добавлен как любые другие зависимости к вспомогательному модулю.
NB. Вы можете также использовать некоторые плагины для исправления папки lib. Некоторые предлагают использовать Maven Directory Plugin
Чтобы установить стороннюю банку, пожалуйста, вызовите команду, как показано ниже
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
НАСТОЯЩИЙ ОТВЕТ ТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ECLIPSE:
Если вы используете Eclipse, поместите jar в lib/, щелкните правой кнопкой мыши по имени jar и нажмите "add to build path". Eclipse создаст "ссылки библиотек" и разместит банку для вас
Он разрешил импорт банки сразу в программе для меня
.classpath
Eclipse, но ваш mvn package
maven build будет brocket, как только вы начнете использовать эту зависимость, так как maven не имеет ее определения, и это должно быть только в pom.xml
У меня была такая же проблема с 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