Как добавить локальные файлы JAR (еще не являющиеся частью репозитория Maven) непосредственно в исходные коды моего проекта?
install-file
скриптов cmd .
Как добавить локальные файлы JAR (еще не являющиеся частью репозитория Maven) непосредственно в исходные коды моего проекта?
install-file
скриптов cmd .
Ответы:
Установите 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>
: группа, в которой файл должен быть зарегистрирован, например, → com.google.code
<artifact-id>
: имя артефакта для файла, например → kaptcha
<version>
: версия файла, например, → 2.3
<packaging>
: упаковка файла, например → jar
Ссылка
install:install-file
целиВы можете добавить локальные зависимости напрямую (как упоминалось в проекте build 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 в моем проекте, который не помещается в репозиторий. Если эта функция будет удалена, то здесь есть много хороших ответов, которые я могу выбрать позже!
artifactId
и groupId
не наоборот?
Во-первых, я хотел бы отдать должное этому ответу анонимному пользователю Переполнения стека - я почти уверен, что видел подобный ответ раньше - но сейчас я не могу его найти.
Наилучшим вариантом для использования локальных файлов 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, который вы не можете опубликовать.
${project.parent.basedir}
как в настоящее время, кажется, ни к чему не приводит, я использовал ${project.basedir}/..
и работал отлично.
<mirrorOf>*</mirrorOf>
.
Создайте новую папку, скажем, local-maven-repo
в корне вашего проекта Maven.
Просто добавьте локальное репо внутри <project>
вашего pom.xml
:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.basedir}/local-maven-repo</url>
</repository>
</repositories>
Затем для каждого внешнего jar, который вы хотите установить, перейдите в корень вашего проекта и выполните:
mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]
local-maven-repo
включена (как дочерний в этом примере) в вашу исходную папку
Я хотел бы такое решение - использовать 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>
тегом). Также можно привязать jar install не к initialize
шагу, а к любому другому шагу, который вам нравится.
mvn initialize
раньше mvn package
: я не могу mvn initialize package
или он пытается загрузить JAR из центрального репозитория. Почему это? Я думал, что это запустит эти цели / фазы в порядке.
compile
), сборка завершится неудачно.
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
<scope>system
устарела сейчас.
install:install-file
артефакт для локального репозитория и использование его в качестве «нормальной» зависимости (с областью действия по умолчанию compile
) или использование внутрикорпоративного решения для хранилища .
Да, вы можете иметь, но это не очень хорошая идея.
Вместо этого установите все эти банки в репозитории Maven
Также см
Очень быстрый и грязный способ - указать на локальный файл:
<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>
<url>file:${basedir}</url>
вместо этого базовый URL.
Добавьте свой собственный локальный 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 следующим образом:
Один из способов - загрузить его в свой собственный менеджер репозитория Maven (например, Nexus). В любом случае, хорошо иметь собственного менеджера хранилища.
Еще один приятный способ, который я недавно видел, - включить плагин установки Maven в жизненный цикл сборки: вы объявляете в POM для установки файлов в локальный репозиторий. Это небольшие, но небольшие накладные расходы и не требующие ручного шага.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
Конечно, вы можете добавить банки в эту папку. Но, может быть, это не то, что вы хотите достичь ...
Если вам нужны эти jar для компиляции, проверьте следующий вопрос: Могу ли я добавить jar в maven 2 buildpath classpath без их установки?
Кроме того, прежде чем кто-либо предложит это, не используйте системную область.
Еще один интересный случай, когда вы хотите иметь в своем проекте приватные баночки 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 / repository и скопируйте структуру каталогов проекта, который вы хотите импортировать, в папку libs .
Например, предположим, что вы хотите импортировать зависимость
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject</artifactId>
<version>1.2.3</version>
</dependency>
Просто зайдите в .m2 / repository, и вы увидите следующую папку
ком / MyCompany / MyProject / 1.2.3
Скопируйте все в свою папку libs (опять же, включая папки в .m2 / repository ), и все готово.
Я думаю, что лучшим решением для этой проблемы является использование 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
местные банки будут добавлены автоматически.
Я хочу поделиться кодом, где вы можете загрузить папку, полную банок. Это полезно, когда у провайдера нет общедоступного репозитория, и вам нужно добавить множество библиотек вручную. Я решил создать .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"))
указывает на то, что будут поддерживаться только пользовательские файлы. Это не то, что нам нужно: вместо этого куча банок сторонних производителей. У вас есть предложения, как установить любую банку таким способом?
Это короткий синтаксис для более новых версий:
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
Также взгляните на ...
<scope>compile</scope>
Maven Зависимости . Это значение по умолчанию, но в некоторых случаях я обнаружил, что Maven явно устанавливает эту область для поиска локальных библиотек в локальном хранилище.
По какой-то причине в веб-приложении, которое я поддерживаю, ни решение Alireza Fattahi, ни решение JJ Roman не работали правильно. В обоих случаях компиляция идет хорошо (она видит банку), но упаковка не включает банку внутри войны.
Единственный способ, которым мне удалось заставить это работать, состоял в том, чтобы поставить банку /src/main/webapp/WEB-INF/lib/
и затем объединить это с решением Фаттахиса или Романа.
Обратите внимание, что это НЕ обязательно хорошая идея использовать локальное репо. Если этим проектом поделятся с другими, тогда у всех будут проблемы и вопросы, когда он не будет работать, и баночка не будет доступна даже в вашей системе контроля версий!
Хотя общий репозиторий - лучший ответ, если вы не можете сделать это по какой-то причине, то встраивание jar лучше, чем локальное репо. Локальное репо может вызвать много проблем, особенно с течением времени.
В вашем локальном хранилище вы можете установить свой jar, выполнив команды
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
Перейдите по этой полезной ссылке, чтобы сделать то же самое с веб-сайта mkyoung. Вы также можете проверить Maven руководство для того же
Чтобы установить сторонний jar, пожалуйста, наберите команду, как показано ниже
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
- установить MVN
Вы можете написать код ниже в командной строке или, если вы используете eclipse, встроенную в maven, щелкните правой кнопкой мыши по проекту -> Выполнить как -> запустить конфигурации ... -> в левой панели щелкните правой кнопкой мыши Maven Build -> новая конфигурация -> напишите код в Цели и в базовом каталоге: $ {project_loc: NameOfYourProject} -> Выполнить
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
<упаковка>: упаковка файла, например -> банка
2. После установки просто объявляет jar в pom.xml.
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>
Шаг 1: Настройте maven-install-plugin
с целью install-file
в вашемpom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external-non-maven-jar-MWS-Client-into-local-maven-repo</id>
<phase>clean</phase>
<configuration>
<repositoryLayout>default</repositoryLayout>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
<file>${project.basedir}/lib/MWSClientJavaRuntime-1.0.jar</file>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
Обязательно отредактируйте file
путь в зависимости от вашего фактического пути к файлу (рекомендуется поместить эти внешние не maven файлы в какую-то папку, скажем lib
, и поместить эту lib
папку в ваш проект, чтобы использовать относительный путь для конкретного проекта и избегать добавления системы конкретный абсолютный путь.
Если у вас есть несколько внешних банок, просто повторите <execution>
для других банок в том же maven-install-plugin
.
Шаг 2: После того, как вы настроили maven-install-plugin
как показано выше в вашем pom.xml
файле, вы должны использовать эти jar pom.xml
как обычно:
<dependency>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
</dependency>
Обратите внимание, что maven-install-plugin
только ваши внешние jar копируются в локальный .m2
репозиторий maven. Вот и все. Эти файлы не включаются автоматически как maven-зависимости в ваш проект.
Это мелочь, но иногда ее легко пропустить.
У меня была такая же ошибка для набора зависимостей в моем pom.xml, оказалось, что версии зависимостей не были указаны в pom.xml и были упомянуты в родительском репозитории. По какой-то причине детали версии не синхронизировались с этим репо. Следовательно, я вручную вводил версии, используя тег, и он работал как шарм. Потребовалось немного времени, чтобы найти версии в родительском и указать здесь. Но это может быть сделано только для банок, которые показывают ошибку артефакта, и это работает. Надеюсь, это кому-нибудь поможет.
В Apache Maven 3.5.4 мне пришлось добавить двойные кавычки. Без двойной цитаты это не сработало для меня.
пример: mvn install: install-file "-Dfile = расположение в файле jar" "-DgroupId = идентификатор группы" "-DartifactId = идентификатор артефакта" "-Dversion = версия" "-Dpackaging = тип пакета"
yourproject
+- pom.xml
+- src
yourproject
+- pom.xml
+- src
+- repo
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
<repositories>
<!--other repositories if any-->
<repository>
<id>project.local</id>
<name>project</name>
<url>file:${project.basedir}/repo</url>
</repository>
</repositories>
<dependency>
<groupId>com.groupid</groupId>
<artifactId>myid</artifactId>
<version>1.0</version>
</dependency>
ЭТОТ ОТВЕТ ТОЛЬКО ДЛЯ ПОТРЕБИТЕЛЕЙ:
Если вы используете Eclipse, поместите банку в lib /, щелкните правой кнопкой мыши по названию баночки и нажмите «добавить в путь сборки». Eclipse создаст «библиотеки с ссылками» и разместит банку для вас
Это решило импорт банки сразу в программе для меня
.classpath
, но ваша сборка maven mvn package
будет расширена, как только вы начнете использовать эту зависимость, так как maven не имеет ее определения, и это должно быть только вpom.xml