Как добавить локальные файлы JAR в проект Maven?

915

Как добавить локальные файлы jar (еще не являющиеся частью репозитория Maven) непосредственно в источниках моей библиотеки проектов?

Показать ещё 1 комментарий
Теги:
maven
repository
libraries
mvn-repo

28 ответов

462
Лучший ответ

Установите 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

<упаковка>: упаковка файла, например → банка

Ссылка

  • 6
    Инструкции по установке на мою сборку содержали все, кроме части generatePom. Это кажется решающим.
  • 3
    <путь к файлу> что это значит? Например, C: /Users/XXX/WorkspaceDocx/maven/src/main/resources/myJar.jar ...... или мы можем сделать $ {project.basedir} /src/main/resources/myJar.jar
Показать ещё 7 комментариев
1193

Вы можете добавить локальные зависимости напрямую (как упоминалось в проекте 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 в моем проекте, который не помещается в репозиторий. Если эта функция будет удалена, то здесь есть много хороших ответов, которые я могу выбрать позже!

  • 39
    Есть моменты, когда вы хотите специально протестировать, например, старую банку, и я думаю, что этот ответ хорошо подходит для этого. Это то, что мне было нужно. Upvoted
  • 2
    Внешняя папка лучше? В этом примере <systemPath> предлагает папку в проекте. Имеет ли смысл хранить такие банки в папке, внешней по отношению к проекту? Вроде как маленький псевдо-репозиторий. Я предполагаю, что Maven вытягивает копию банки из такой внешней папки.
Показать ещё 13 комментариев
86

Во-первых, я хотел бы отдать должное этому анонимному пользователю 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 для репо-кода исходного кода не является хорошей практикой, но в реальной жизни быстрое и грязное решение иногда лучше, чем полномасштабное переключение нексуса, чтобы разместить одну банку, которую вы не можете опубликовать.

  • 0
    Локальный относительный каталог как репозиторий maven ... Очень помог
  • 1
    Если вы хотите сделать это в pom.xml, посмотрите baeldung.com/install-local-jar-with-maven
Показать ещё 6 комментариев
78

Создайте новую папку, скажем 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]
  • 10
    Это единственный правильный ответ, так как он будет правильно создавать репозиторий при использовании deploy.
  • 2
    Это работает намного лучше, чем принятый ответ, потому что это не портит пакет mvn
Показать ещё 7 комментариев
23
<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>
  • 6
    <scope>system устарела.
22

Мне хотелось бы такого решения - используйте 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, а любым другим шагом, который вам нравится.

  • 1
    Это хорошо работает для меня, но только если я запускаю mvn initialize перед mvn package : я не могу mvn initialize package иначе он пытается загрузить JAR из центрального репозитория. Почему это? Я думал, что это будет запускать эти цели / фазы в порядке.
  • 1
    На самом деле, они должны быть запущены в порядке. Взгляните на список жизненного цикла по умолчанию: maven.apache.org/guides/introduction/… Вы можете использовать другой шаг для связывания.
Показать ещё 3 комментария
14

Да, вы можете иметь, но это не очень хорошая идея.

Вместо этого установите все эти банки в maven repos

Также см.

9

Один из способов - загрузить его в свой собственный менеджер хранилища Maven (например, Nexus). Хорошая практика иметь собственный менеджер хранилища.

Еще один хороший способ, который я недавно видел, - включить Maven Install Plugin в жизненный цикл сборки: вы объявляете в POM для установки файлов в локальный репозиторий. Это немного, но небольшие накладные расходы и никакого ручного шага.

http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html

  • 3
    В конечном итоге переход на Gradle. Это не работает Если локальный jar определен как зависимости, maven не будет запускать плагины до разрешения зависимостей, ручная установка неизбежна. нашел обсуждение этой ситуации: stackoverflow.com/questions/5951999/…
8

Добавьте свой собственный локальный 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 следующим образом:

Изображение 1377

  • 0
    Я получил ошибку Не удалось установить артефакт (доступ запрещен). Как я могу решить это? @Aurasphere
  • 1
    @RamzahRehman попробуйте открыть командную строку с привилегиями admi, щелкнув ее правой кнопкой мыши и выбрав «Запуск от имени администратора».
7

Очень быстрый и грязный способ - указать на локальный файл:

<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>
  • 0
    Для локальных URL-адресов хранилища они могут быть относительными или должны быть абсолютными?
  • 0
    @Dragas Я не пробовал, пожалуйста, дайте нам знать, если вы сделали.
Показать ещё 1 комментарий
7

Конечно, вы можете добавить банки в эту папку. Но, возможно, это не то, что вы хотите достичь...

Если вам нужны эти банки для компиляции, проверьте этот связанный вопрос: Могу ли я добавить банки в maven 2 build classpath без их установки?

Кроме того, прежде чем кто-либо подскажет это, НЕ используйте системную область.

6

:

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
3

Еще один интересный случай - когда вы хотите иметь в своем проекте частные банки 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/репозиторий), и все готово.

3

Предпочтительным способом было бы создать собственный удаленный репозиторий.

Подробнее о том, как это сделать, см. здесь. Посмотрите раздел Загрузка в удаленный репозиторий.

2

Это короткий синтаксис для более новых версий:

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

2

Я хочу поделиться кодом, в котором вы можете загрузить папку с банками. Это полезно, когда у провайдера нет общего репозитория, и вам нужно добавить много библиотек вручную. Я решил построить .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.

  • 0
    Ваш код 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")) . Это не то, что нам нужно: вместо этого куча банок сторонних производителей. У вас есть предложения, как установить любую банку таким способом?
  • 0
    Я исправил ваш код: я поставил ответ внизу.
2

Также взгляните на...

<scope>compile</scope>

Зависимости Maven. Это значение по умолчанию, но я обнаружил, что в некоторых случаях явным образом устанавливаю эту область также Maven для поиска локальных библиотек в локальном репозитории.

1

Я думаю, что лучшим решением этой проблемы является использование 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 локальные банки автоматически добавляются.

1

По какой-то причине в веб-приложении я поддерживаю обслуживание, а не решение Aliraza Fattahi и решение JJ Roman работал правильно. В обоих случаях компиляция идет хорошо (она видит банку), но упаковка не включает флягу в войну.

Единственный способ, которым мне удалось это сделать, - положить банку на /src/main/webapp/WEB-INF/lib/, а затем объединить ее с решением Fattahis или Roman.

1

В вашем локальном репозитории вы можете установить свою банку, выпустив команды

 mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

Следуйте этой полезной ссылке, чтобы сделать то же самое с сайта mkyoung. Вы также можете проверить руководство maven для того же

  • 0
    Чем этот ответ отличается от ранее принятого ответа?
1

Обратите внимание, что не обязательно использовать локальное репо. Если этот проект делится с другими, тогда у всех остальных будут проблемы и вопросы, когда он не будет работать, и банка будет недоступна даже в вашей системе управления версиями!

Хотя общий репо - лучший ответ, если вы не можете сделать это по какой-то причине, тогда встраивание фляги лучше, чем локальное репо. Локальное содержимое репо может вызвать множество проблем, особенно с течением времени.

  • 1
    если вы добавляете jar-файлы в систему управления версиями, библиотеки всегда будут доступны вместе с источником. Нет источника, нет библиотек. С maven вместо этого источник может быть в порядке, но хранилище недоступно.
  • 0
    @Frank ... есть идеи о том, как создать исполняемый файл jar, не включая внешние зависимости (библиотечные файлы)?
Показать ещё 1 комментарий
0

В Apache Maven 3.5.4 мне пришлось добавить двойную цитату. Без двойной цитаты это не сработало для меня.

Пример: mvn install: install-file "-Dfile = расположение файла jar" "-DgroupId = идентификатор группы" "-DartifactId = артефакт id" "-Dversion = версия" "-Dpackaging = тип пакета"

0
  1. 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>
0

У меня была такая же ошибка для набора зависимостей в моем pom.xml, что версии зависимостей не были указаны в pom.xml и упоминались в родительском репозитории. По какой-то причине сведения о версии не синхронизировались с этим репо. Следовательно, я вручную ввел версии с использованием тега, и он работал как шарм. Немного времени, необходимого для поиска версий в родительском и укажите здесь. Но это можно сделать только для банок, которые показывают артефактную ошибку, и это работает. Надеюсь, это поможет кому-то.

0

Использование 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

0

Чтобы установить стороннюю банку, пожалуйста, вызовите команду, как показано ниже

mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
0

НАСТОЯЩИЙ ОТВЕТ ТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ECLIPSE:

Если вы используете Eclipse, поместите jar в lib/, щелкните правой кнопкой мыши по имени jar и нажмите "add to build path". Eclipse создаст "ссылки библиотек" и разместит банку для вас

Он разрешил импорт банки сразу в программе для меня

  • 4
    Это добавит запись в .classpath Eclipse, но ваш mvn package maven build будет brocket, как только вы начнете использовать эту зависимость, так как maven не имеет ее определения, и это должно быть только в pom.xml
-2

У меня была такая же проблема с 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню