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


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

27 824

27 ответов:

установите 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.банку

: группа, в которой файл должен быть зарегистрирован под e.g -> com.гуглить.код

: имя артефакта для файла e. g -> kaptcha

: версия файла например - > 2.3

: упаковка файла, например - > jar

ссылка

вы можете добавить локальные зависимости напрямую (как указано в построить проект 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>

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

лучший вариант для наличия локальных файлов jar в качестве зависимости-создать локальный репозиторий maven. Такое РЕПО-это не что иное, как правильная структура каталогов с файлами pom в ней.

на моем примере: У меня есть мастер-проект на ${master_project} расположение и субпроект1 включен ${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>

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

Onece jar файл установлен такой mvn РЕПО может быть совершен в хранилище кода и вся настройка является независимой от системы. (рабочий пример в github)

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

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

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

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

по какой-то причине в веб-приложении я даю обслуживание, ни решение Алирезы Фаттахи, ни решение JJ Романа правильно работал. В обоих случаях компиляция идет хорошо (он видит банку), но упаковка не включает банку внутри войны.

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

ЭТОТ ОТВЕТ ТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ECLIPSE:

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

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

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

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

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

Я думаю, что лучшим решением этой проблемы является использование maven-install-plugin для автоматической установки файлов во время установки. Вот как я настроил его для моего проекта.

во-первых, добавьте путь (где хранятся местные .банки) в собственность.

<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 install

вы можете написать код ниже в командной строке или если вы используете eclipse builtin maven щелкните правой кнопкой мыши на project -> Run As -> run Configuration... -> в левой панели щелкните правой кнопкой мыши на Maven Build - > новая конфигурация - > напишите код в целях и в базовом каталоге: ${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.гуглить.код

: имя артефакта для файла, например - > kaptcha

: версия файла, например - > 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