Як додати локальні файли jar до проекту Maven?


1171

Як додати локальні файли jar (ще не входять у сховище Maven) безпосередньо в бібліотечні джерела мого проекту?


1
Привіт @Praneel PIDIKITI, Чи можете ви, будь ласка, змінити прийняту відповідь на ту, що отримала найбільше голосів?
null

1
@nslntmnx Це не буде кращим рішенням, оскільки всі рішення мають недоліки stackoverflow.com/questions/364114/…
Пол Верест,

Якщо ваші лінзи оновлюються чи розширюються при нагоді, дивіться цю відповідь на Я хочу завантажувати всі JAR-файли з моєї папки проекту libs з maven на «пом’якшений» спосіб, і таким чином уникати додаткової папки repo та громіздких cmd-ліній чи install-fileсценаріїв.
ГерольдБрозер повертає Моніку

Відповіді:


699

Встановіть 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

Довідково


7
В інструкціях до встановлення на моїй збірці було все, крім частини generatorPom. Це здається вирішальним.
Джейсон Д

4
<path-to-file> що це означає? Як і C: /Users/XXX/WorkspaceDocx/maven/src/main/resources/myJar.jar ...... чи ми можемо зробити $ {project.basedir} /src/main/resources/myJar.jar
Ігор Beaufils

17
Відповідь не згадує README або про те, що банки привозять із собою. Однак якщо проект приносить банки, тоді ви також можете помістити репо в проект, як згадується тут, stackoverflow.com/a/36602256/1000011, тоді вам не потрібно README, оскільки проект просто працюватиме так, як ніби банки були в центральній станції Maven без зайвих ручних кроків.
оптициклічний

8
@opticyclic ваш коментар потребує більше оновлень, або цю відповідь потрібно відредагувати. Це рецепт катастрофи для новачків, які не усвідомлюють, що встановлення на місцевий ревіз Maven не стосується всіх інших.
Майк S


1427

Ви можете додавати локальні залежності безпосередньо (як це було зазначено в проекті 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://isissue.apache.org/jira/browse/MNG-6523 (Ви можете брати участь і описати, чому ця функція корисна в деяких випадках). Я сподіваюся, що ця функція залишається там!

Якщо ви запитуєте мене, доки функція не буде видалена, я використовую цю функцію, щоб залежати лише від одного неслухняного файлу jar в моєму проекті, який не вміщується в сховище. Якщо цю функцію буде знято, ну тут є багато хороших відповідей, які я можу обрати згодом!


49
Бувають випадки, коли ви хочете спеціально протестувати стару банку, наприклад, і я вважаю, що ця відповідь добре підходить для цього. Мені це було потрібно. Upvoted
Джон Локвуд

36
Настільки ж приємно і просто, як виглядає, це рішення має проблему, що yourJar.jar не буде включений у файл WAR для вашої програми.
Маттіас

40
Наведене вище рішення більше не працює, воно повертається: "'зависимостей.dependency.systemPath' для xx.jar не повинно вказувати на файли в каталозі проекту" Це вже було розроблено в stackoverflow.com/questions/10935135/…
sarah .ferguson

8
У цій відповіді, чи не так artifactIdі groupIdнеправильно?
theonlygusti

5
Відповідно до документа Maven ( maven.apache.org/guides/introduction/… ): Важлива примітка: Це позначено як застаріле.
посередник

142

По-перше, я хотів би віддати подяку за цю відповідь анонімному користувачу Stack Overflow - я майже впевнений, що раніше я бачив подібну відповідь - але зараз я не можу її знайти.

Найкращим варіантом наявності локальних файлів JAR як залежність є створення локального сховища Maven. Таке сховище - це не що інше, як правильна структура каталогів з пом-файлами в ньому.

Для мого прикладу: у мене головний проект про ${master_project}місцезнаходження та підпроект1 увімкнено ${master_project}/${subproject1}.

Потім я створити репозиторій Maven в: ${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>

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


Місцевий відносний каталог як maven repo ... Допомагав дуже
sura2k

4
Якщо ви хочете зробити це у pom.xml, перегляньте baeldung.com/install-local-jar-with-maven
Kai Wang

@Kai Wang Це рішення працює набагато краще! ви можете, можливо, додати це як відповідь.
lockwobr

7
Оскільки ${project.parent.basedir}, схоже, ні до чого не вирішується, я використовував ${project.basedir}/..і працював досконало.
The Impaler

1
Порада: перевірте $ HOME / .m2 / settings.xml , уникайте, щоб "local-maven-repo" відображався налаштуваннями / дзеркалами / дзеркалом <mirrorOf>*</mirrorOf>.
btpka3

125

Створіть нову папку, скажімо, 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]

16
Це єдина правильна відповідь тут, оскільки вона створить ваше репо правильно під час використання розгортання.
оптициклічний

Чи працює цей підхід, якщо код розгорнуто за допомогою сервера збирання CI? Схоже, автоматизовані збірки не мали б доступу до залежності.
Wallace Howery

2
@ user2748659 так, якщо на ваших серверах побудови CI папка local-maven-repoвключена (як дитина в цьому прикладі) у вашу вихідну папку
Ентоні О.

3
Ця відповідь - це те, що працювало для мене. Для спільного проекту, додавши репо в каталог проектів і додавши до контролю версій, гарантується, що кожен, хто перевіряє проект, не матиме відсутніх залежностей. Якщо у вас багато залежностей, то спільне віддалене РЕПО, мабуть, краще рішення, інакше зберігати репо в каталозі проекту цілком чудово.
Акварель

2
Зауважте, що для цього вам може знадобитися додати -Dpackaging = jar. В іншому випадку ви отримаєте "Інформація про артефакт неповна або недійсна: упаковка відсутня".
J Woodchuck

43

Мені б хотілося таке рішення - використовувати 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і банку буде встановлена ​​в місцевому maven repo. Тепер ця баночка доступна під час будь-якого кроку Maven на цій машині (не забудьте включити цю залежність як будь-яку іншу залежність Maven у пом із <dependency></dependency>тегом). Також можна прив’язати установку jar не до initializeкроку, а будь-якого іншого кроку, який вам подобається.


2
Це добре працює для мене, але лише в тому випадку, якщо я запускаюсь mvn initializeраніше mvn package: я не можу mvn initialize packageабо ще намагається завантажити JAR з центрального репо. Чому це? Я думав, що це буде виконувати цілі / фази в порядку.
DavidS

1
Насправді їх слід запускати по порядку. Погляньте на список життєвого циклу за замовчуванням: maven.apache.org/guides/introduction/… Ви можете скористатися ще одним кроком для прив’язки.
сфінкси

2
Я намагався кожен метод, але врешті-решт мені довелося вдатися до цього рішення. Основна причина полягає в тому, що я хотів мати можливість локально створювати пакунки в автономному режимі. Якщо я заявив про це як залежність від локально визначеного сховища, це завжди розглядалося як лише чергове репортаж в Інтернеті, і збірка Maven скаржилася на те, що артефакт не оштрафував. Це рішення чудово працює для кожного випадку.
Маулі

2
Я думаю, що краще використовувати чисту фазу, оскільки ініціалізація буде виконуватися кожного разу, коли ми використовуємо mvn-пакет, коли його непотрібно. Нарешті, якщо нам потрібно лише генерувати jar / war, ми можемо використовувати mvn чистий пакет безпосередньо .
Deoxyseia

" Також можна зв'язати установку jar не ініціалізувати крок, але будь-який інший крок, який вам подобається. " Не обов'язково відповідає дійсності. Якщо залежність ще не знаходиться в репо, і використовується фаза, що настає після фази, яка вирішує залежності (наприклад compile), збірка не вийде.
ГерольдБрозер повертає Моніку

29
<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>


@GeroldBroser - добре. що ми можемо використовувати замість цього?
MasterJoe2

2
@ MasterJoe2 Як уже згадувалося у прийнятій відповіді install:install-file артефакт для місцевого репо і використовуйте його як "нормальну" залежність (зі сферою за замовчуванням compile) або використовуйте рішення для сховища в проекті .
ГерольдБрозер повертає Моніку


14

Справді швидкий і брудний спосіб - вказати на локальний файл:

<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) або якщо у вас немає жодного з них або не хочете встановити локальну систему структурований архів та налаштування "сховища" у вашому 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>

для цього можливий також відносний шлях, використовуючи змінну базиру:

<url>file:${basedir}</url>

Вони можуть бути відносними для місцевих URL-адрес сховища чи повинні бути абсолютними?
Драгас

@Dragas Я не намагався, будь ласка, повідомте нас, якщо ви це зробили.
fl0w

1
Так, мабуть, вам потрібно використовувати <url>file:${basedir}</url>як базовий URL.
Драгас

11

Додайте свій власний локальний 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 так:

введіть тут опис зображення


Я отримую помилку Не вдалося встановити артефакт (доступ заборонено). Як я можу це вирішити? @Aurasphere
Ramzah Rehman

1
@RamzahRehman спробуйте відкрити командний рядок із привілеями адміністрування, клацнувши правою кнопкою миші та виберіть "Запустити як адміністратор"
Aurasphere

9

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

Ще один приємний спосіб, який я нещодавно бачив, - це включити модуль встановлення Maven у свій життєвий цикл збірки: Ви заявляєте в POM, щоб встановити файли в локальне сховище. Це невеликий, але невеликий накладні витрати і жодного ручного кроку не передбачається.

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


4
У кінцевому підсумку з переходом на gradle. Це не працює Якщо локальний jar визначений як залежність, maven не виконає плагіни до усунення залежностей, ручна установка неминуча. знайшов disscussion про цю ситуацію: stackoverflow.com/questions/5951999 / ...
xinthink

7

Звичайно, ви можете додати банки до цієї папки. Але, можливо, це не те, чого ви хочете досягти ...

Якщо вам потрібні ці банки для компіляції, перевірте це пов'язане питання: Чи можна додати банки до Maven 2 build classpath, не встановлюючи їх?

Крім того, перш ніж хтось запропонує це, НЕ використовуйте область застосування системи.


6

Ще один цікавий випадок, коли ви хочете мати у своєму проекті приватні баночки 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 / сховище, і ви побачите наступну папку

com / mycompany / myproject / 1.2.3

Скопіюйте все у свою папку libs (знову ж таки, папки під .m2 / сховище ), і ви закінчите.


6

командний рядок :

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

5

Важлива роль у залежності: $ {pom.basedir} (замість просто $ {basicir})

<dependency>
    <groupId>org.example</groupId>
    <artifactId>example</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/src/lib/example.jar</systemPath>
</dependency>

4

Я думаю, що краще рішення цієї проблеми - використовувати плагін maven-install для автоматичного встановлення файлів у час установки. Ось як я створив це для свого проекту.

Спочатку додайте шлях (де ви зберігаєте місцеві .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місцеві банки будуть додані автоматично.


3

Кращим способом було б створення власного віддаленого сховища.

Дивіться тут для подробиць про те , як це зробити. Перегляньте розділ « Завантаження у віддалений сховище ».


3

Я хочу поділитися кодом, куди ви можете завантажити папку, наповнену банками. Це корисно, коли постачальник не має загальнодоступного сховища і вам потрібно додати багато бібліотек вручну. Я вирішив створити .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"))Здається, ваш код вказує, що підтримуватимуться лише спеціальні банки. Це не те, що нам потрібно: натомість купу сторонніх банок. Чи є у вас пропозиції, як встановити будь-яку банку таким чином?
javadba

Я виправив ваш код: я ставлю відповідь внизу.
javadba

3

Це короткий синтаксис для новіших версій:

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

Також погляньте на ...

<scope>compile</scope>

Maven залежності . Це за замовчуванням, але я виявив, що в деяких випадках явно встановлюю, що це поле також дозволяє Maven знаходити локальні бібліотеки в локальному сховищі.


2

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

Єдиний спосіб, коли мені вдалося змусити його працювати, - поставити банку /src/main/webapp/WEB-INF/lib/і потім поєднати її з рішенням Фаттахіса або Романа.


1

Зауважте, що НЕ обов'язково корисно використовувати місцеве репо. Якщо цей проект ділиться з іншими, тоді всі інші матимуть проблеми та питання, коли він не працює, і баночка не буде доступною навіть у вашій системі управління джерелами!

Хоча спільне репо - найкраща відповідь, якщо ви не можете цього зробити, то вбудовувати банку краще, ніж локальне репо. Вміст репо лише для локальних мереж може спричинити багато проблем, особливо з часом.


1
якщо додати банки в систему управління джерелами, бібліотеки завжди будуть доступні разом із джерелом. Немає джерела, немає бібліотек. З Maven замість джерела може бути нормально, але сховище недоступне.
sarah.ferguson

@Frank ... будь-яка ідея про те, як створити виконуваний jar без включення зовнішніх залежностей (бібліотечні файли)?
Satish Karuturi

Для когось, хто не знайомий і шукає відповідь на оригінальне запитання, що означає "вбудовування баночки"?
cdock

1

У вашому локальному сховищі ви можете встановити свою банку, видаючи команди

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

Перейдіть за цим корисним посиланням, щоб зробити те саме на веб-сайті mkyoung. Ви також можете перевірити Maven guide для того ж


1

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

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

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

<group-id>: група, під якою файл повинен бути зареєстрований, наприклад -> com.google.code

<artifact-id>: назва артефакту для файлу, наприклад -> kaptcha

<версія>: версія файлу, наприклад -> 2.3

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

2. Після встановлення просто оголошує банку в pom.xml.

 <dependency>
      <groupId>com.google.code</groupId>
      <artifactId>kaptcha</artifactId>
      <version>2.3</version>
 </dependency>

1

Крок 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файлі, ви повинні використовувати ці банки pom.xmlяк у звичайному:

    <dependency>
        <groupId>com.amazonservices.mws</groupId>
        <artifactId>mws-client</artifactId>
        <version>1.0</version>
    </dependency>

Зауважте, що maven-install-pluginваші зовнішні банки копіюються лише в ваш місцевий.m2 сховище Maven. Це воно. Це автоматично не включає ці банки як основні залежності до вашого проекту.

Це другорядний момент, але іноді його легко пропустити.


0

У мене була така ж помилка для набору залежностей у моєму pom.xml, виявляється, версії залежностей не були вказані в pom.xml і згадувалися в батьківському сховищі. Чомусь деталі версії не синхронізуються з цим репо. Отже, я вручну вводив версії за допомогою тегу, і він працював як шарм. Трохи часу, необхідного для пошуку версій у батьківській програмі та вкажіть тут. Але це можна зробити лише для банок, які показують артефактидну помилку, і вона працює. Сподіваюся, що це комусь допоможе.


0

У Apache Maven 3.5.4 мені довелося додати подвійну пропозицію. Без подвійної цитати мені це не вийшло.

приклад: mvn install: install-file "-Dfile = розташування до файлу jar" "-DgroupId = ідентифікатор групи" "-DartifactId = ідентифікатор артефакту" "-Dversion = версія" "-Dpackaging = тип пакета"


0
  1. Створіть локальний каталог сховищ Maven, корінь вашого проекту повинен виглядати приблизно так:
yourproject
+- pom.xml
+- src
  1. Додайте стандартний каталог сховища Maven під назвою repo для групи com.example та версії 1.0:
yourproject
+- pom.xml
+- src
+- repo
  1. Розгорніть артефакт у Repo, Maven може розгорнути артефакт для вас, використовуючи mvn, розгорнутий-файл-мета:
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
  1. встановіть файл Pom, що відповідає вашій банці, щоб ваш проект міг знайти банку під час складання Maven з локального репо:
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
  1. додати репо в свій файл пам’яті:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>
  1. додайте залежність у своєму пом:
<dependency>
    <groupId>com.groupid</groupId>
    <artifactId>myid</artifactId>
    <version>1.0</version>
</dependency>

-2

ЦЕ ВІДПОВІДЬ ТОЛЬКО для споживачів ECLIPSE:

Якщо ви використовуєте Eclipse, помістіть банку в lib /, клацніть правою кнопкою миші назву банку та натисніть "Додати до шляху складання". Eclipse створить "бібліотеки, на які посилаються", і розмістить вам банку

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


5
Це додасть запису до Eclipse .classpath, але ваша mvn packageкоманда Maven буде брокером, як тільки ви почнете використовувати цю залежність, оскільки maven не має цього визначення, і це має бути лише вpom.xml
Paul Verest

так, ви маєте рацію, пакет не міститиме місцеву банку Але я відповів на запитання, як додати його до проекту (затьмареним способом).
Анандкумар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.