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

enter image description here


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

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

  1. создать папку libs в проекте
  2. добавьте следующие строки в 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>
    
  3. открыть .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 местные банки будут добавлены автоматически.


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