Maven: найкращий спосіб пов’язати спеціальний зовнішній JAR зі своїм проектом?


151

Це моя перша пара днів, коли я навчаюсь Мейвен, і я все ще борюся з основами. У мене є зовнішній .jar-файл (не доступний у загальнодоступних репортажах), на який мені потрібно посилатись у своєму проекті, і я намагаюся розібратися, який мій найкращий варіант.

Це невеликий масштабний проект без центрального сховища для бібліотек, тому він повинен бути або локальним сховищем (якимось чином доданим до контролю джерела, не знаю, чи повинен він працювати таким чином?), Або .jar потрібно зберігати на диск поза будь-яким офіційним сховищем.

1) Який найкращий варіант для додавання .jar-файлу до посилань мого проекту з maven, враховуючи, що я хочу, щоб і проект, і бібліотека знаходились у контролі джерела?

2) Я все ще не можу здатися, що затемнення бачить Затемнення. Я вручну додав його до розділу пам’яті, і він відображається чудово у списку залежностей у m2eclipse. Компіляція mvn і mvn пакет мають успіх, але запуск програми призводить до:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

Це після редагування POM як:

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

Чи повинен я виконувати mvn install: install-file навіть думав, що у мене вже відредагований pom.xml, як описано вище?

Дякую!

Відповіді:


67

Я думаю, ви повинні використовувати mvn install:install-fileдля заповнення свого локального сховища банками бібліотеки, тоді вам слід змінити область застосування від системи до компіляції.

Якщо ви починаєте з maven, я пропоную використовувати maven безпосередньо, а не плагіни IDE, оскільки це додає додатковий рівень складності.

Щодо помилки, чи ставите ви потрібні банки на свій класний шлях? Якщо ви використовуєте типи з бібліотеки, вам потрібно мати доступ до неї також під час виконання. Це не має нічого спільного з самим Maven.

Я не розумію, чому ви хочете поставити бібліотеку на управління джерелом - це джерело коду, а не бінарні банки.


36
Докладніше про mvn install::install-file: mkyong.com/maven/…
Doug T.

7
Використання mvn install::install-fileу вашому локальному сховищі означатиме, що кожен, хто клонує ваш вихідний код, також повинен буде виконати цей крок вручну. В іншому випадку збірка вийшла з ладу
Ісен Нг

це не додасть банку до файлу війни.
Прачі

207

Ви можете створити In сховище проектів, тому вам не доведеться run mvn install:install-fileщоразу працювати на новому комп’ютері

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

детально читайте цю публікацію в блозі

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-libraries-maven


2
Використовуючи вищезазначене рішення, показано попередження під час виконання пакету "mvn clean paket" - POM для проекту <ім'я_визначення_файлу> відсутнє, інформація про залежність відсутня.
Jignesh Gohel

Це найкраще рішення для тих випадків, коли вам потрібно додати один або декілька файлів jar. Дякую.
Антоніо Сесто

2
Або, ви можете додати локальні залежності безпосередньо , як в stackoverflow.com/a/22300875/640378
mauryat

2
Мені довелося використовувати файл: /// $ {project.basedir} / libs (3 переслані косої риски) замість файлу: // $ {project.basedir} / libs
Loc Phan

2
Якщо jar не встановлюється, не є компільованим файлом maven, вам також потрібно буде додати новий файл pom для визначення метаданих. Щоб врятувати себе від усіх цих проблем вручну, я б рекомендував скористатись, mvn install:install-fileа потім скопіювати всю структуру каталогів з вашого локального сховища до вашого сховища проекту.
Ісен Нг

33

Це легко досягти, використовуючи елемент <scope>, вкладений всередині елемента <dependency>.

Наприклад:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

Довідка: http://www.tutorialspoint.com/maven/maven_external_dependency.htm


Цей метод працює дуже добре, коли у вас є лише Eclipse Embedded Maven, і вам не вистачає плагіна встановлення (офлайн-система), тому ви не можете запустити installціль у залежний від проекту проект. Ofc з системою з повітряним покриттям і з усіма плагінами, окрім плагіна встановлення, є досить рідкісною ситуацією.
Cardin Lee JH

1
Найпростіший і найпростіший.
Аджай Кумар

як додати шлях до локальної залежності, який знаходиться поза папкою $ {project.basedir}, як я хочу, щоб $ {basedir} \ src \ lib \ ldapjdk.jar шлях 1 рівня був вище в іншій папці
Naveen Kumar

Я отримую помилку -"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10may

28

Посібник Maven говорить, щоб зробити це:

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

4
цю команду встановіть lib у ваш ревізор Maven. Мінус цього полягає в тому, що якщо ви намагаєтеся працювати над проектом на іншому комп’ютері, вам доведеться запустити це ще раз.
Чарлі Ву

25

оновлення Ми щойно встановили власний сервер Nexus, набагато простіше і чистіше.

У нашої компанії у нас були кілька банок, які ми були звичайними, але їх не розміщували в жодних сховищах Maven, і ми не хотіли мати їх у місцевих сховищах. Ми створили дуже просте репортаж mvn (public) на Github (але ви можете розмістити його на будь-якому сервері чи локально):
зауважте, що це ідеально лише для керування кількома рідко скануючими файлами jar

  1. Створіть репо на GitHub:
    https://github.com/<user_name>/mvn-repo/

  2. Додайте сховище в pom.xml
    (Зверніть увагу, що невідкритий файл повного шляху буде дещо іншим, ніж ім'я репо)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. Додайте залежність до хоста (Github або приватний сервер)
    a. Все, що вам потрібно знати, - це те, що файли зберігаються у шаблоні, згаданому @glitch
    /groupId/artifactId/version/artifactId-version.jar
    b. На своєму хості створіть папки, щоб відповідати цьому шаблону.
    тобто, якщо у вас є ім'я файлу jar service-sdk-0.0.1.jar, створіть папку service-sdk/service-sdk/0.0.1/і помістіть service-sdk-0.0.1.jarу неї файл jar .
    c. Перевірте його, намагаючись завантажити банку з браузера (у нашому випадку:https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. Додайте залежність у файл pom.xml:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. Насолоджуйтесь


приємно, це наймасштабніше рішення, яке я знайшов, дякую
Чарлі Ву

11

Не використовуйте systemPath. На відміну від сказаних тут людей, ви можете помістити зовнішню банку в папку під каталогом проектів, які ви перевірили, і притулок Мавен знайде це як інші залежності. Ось два важливі кроки:

  1. Використовуйте "mvn install: install-file" з -DlocalRepositoryPath.
  2. Налаштуйте сховище, щоб вказати на цей шлях у вашій POM.

Це досить просто, і ви можете знайти покроковий приклад тут: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


8

Осібний спосіб додати банки "Maven" до проекту Maven

Проект Maven і баночки без Maven

Додайте плагіни для встановлення Maven у розділ збирання

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Додайте залежність

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

Список літератури Примітка Я є власником блогу


Як ви знаєте версії баночок та Maven встановлення плагіна?
оск

версії баночок тільки що складені, Maven встановити версії плагіна - найновіша версія
Майстерня

7

Якщо ви зіткнулися з тією ж проблемою, і ви використовуєте spring-boot v1.4 + , ви можете зробити це таким чином.

Існує includeSystemScope, який можна використовувати для додавання залежностей системного масштабу в банку.

напр

Я використовую драйвер Oracle у своєму проекті.

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

тоді зробіть includeSystemScope = true, щоб включити jar в шлях / BOOT-INF / lib / **

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

і виключити з ресурсу, щоб уникнути дублювання включати, баночка жирова ~

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

Удачі!


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

Як щодо кількох баночок ??
mithun_ghose

4

Змініть ваш systemPath .

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

3

Pom.xml перегляне ваше місцеве сховище, щоб спробувати знайти залежність, яка відповідає вашому артефакту. Крім того, ви не повинні використовувати атрибути системи або атрибути systemPath, вони зазвичай зарезервовані для речей, що знаходяться в JDK, а не в JRE

Дивіться це запитання щодо встановлення артефактів Maven.


3

Зауважимо, що всі приклади, які використовують

<repository>...</respository> 

вимагають зовнішнього

<repositories>...</repositories> 

що додають теги. З деяких прикладів незрозуміло.


2

Найкраще тут - встановити сховище: Nexus або Artifactory. Якщо ви надаєте місце для розміщення подібних речей, а ви також прискорюєте роботу, кешуючи свої речі зовні.

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

Дивіться путівник .


1

За допомогою Eclipse Oxygen ви можете виконати наступні дії:

  1. Розмістіть свої бібліотеки в WEB-INF / lib
  2. Проект -> Налаштування шляху збірки -> Додати бібліотеку -> Бібліотека веб-додатків

Maven візьме їх під час встановлення проекту.


3
Якщо я це роблю, чи повинні інші користувачі, які витягують мій проект, робити те саме в Eclipse?
cruxi

0

Якщо зовнішня банка створена лише проектом Maven, ви можете скопіювати весь проект у вашу систему та запустити

mvn install

в каталозі проектів. Це додасть банку в каталог .m2, який є локальним сховищем Maven.

Тепер ви можете додати

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

Це забезпечить вас

mvn exec:java 

працює. Якщо ви використовуєте запропоновані тут

<scope>system</scope>

Тоді вам доведеться додавати класи окремо під час використання виконання командного рядка.

Ви можете додати зовнішні банки за допомогою наступної команди, описаної тут

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

0

Найефективніший і найчистіший спосіб, який я знайшов для вирішення цієї проблеми, - це використання пакетів Github

  1. Створіть простий порожній публічний / приватний сховище на GitHub відповідно до вашої вимоги, хочете ви, щоб ваша зовнішня банка була публічно розміщена чи ні.

  2. Запустіть нижче команду maven, щоб розгорнути зовнішню банку в створеному вище сховищі github

    mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar -Dfile= path-to-file \ -DrepositoryId= id-to-map-on-server-section-of-settings.xml \ -Durl=https://maven.pkg.github.com/github-username/github-reponame-created-in-above-step

    Вищенаведена команда розгорне вашу зовнішню банку в сховищі GitHub, згаданому в -Durl=. Ви можете посилатися на це посилання на тему: Як розгорнути залежності як підручник GitHub Packages GitHub Package Deployment Package

  3. Після цього ви можете додати залежність , використовуючи groupId, artifactIdі versionзгадані в зазначеній вище стадії в мавена pom.xmlі запуститиmvn install

  4. Maven знайде залежність зовнішньої банки від реєстру GitHub Packages і надасть у вашому проекті Maven.

  5. Для цього вам також знадобиться налаштувати maven's settings.xmlдля отримання з реєстру пакетів GitHub.

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