Чи можна додати банки до Maven 2 build classpath, не встановлюючи їх?


700

Maven2 зводить мене з розуму під час експериментальної / швидкої та брудної фази розробки.

У мене є pom.xmlфайл, який визначає залежності для рамки веб-додатків, які я хочу використовувати, і я можу швидко генерувати початкові проекти з цього файлу. Однак іноді мені хочеться зв’язатись із сторонньою бібліотекою, яка не має pom.xmlвизначеного файлу, тому замість того, щоб створити pom.xmlфайл для lib сторонньої сторони вручну та встановити його, і додати залежність до моєї pom.xml, я просто хотів би щоб сказати Мейвен: "Окрім моїх визначених залежностей, включайте будь-які банки, які /libтеж є".

Здається, це повинно бути простим, але якщо воно є, я щось пропускаю.

Будь-які вказівки щодо того, як це зробити, дуже вдячні. За винятком цього, якщо є простий спосіб вказати maven на /libкаталог і легко створити a pom.xmlз усіма доданими банками, відображеними на єдину залежність, яку я міг би потім назвати / встановити і посилати одним махом, також буде достатньо.


Якщо ви використовуєте Netbeans, просто виконайте наступні дії: [Як встановити модулі в сховище Maven за допомогою вбудованого Netbeans Maven?] [1] [1]: stackoverflow.com/a/339874/530153
Rajat Gupta

1
Хочу зазначити, що це посилання stackoverflow.com/a/339874/530153, здається, працює для встановлення банок по черзі.
Павло

Відповіді:


601

Проблеми народних підходів

Більшість відповідей, які ви знайдете в Інтернеті, запропонують вам встановити залежність у вашому локальному сховищі або вказати "системний" обсяг у pomта розподілити залежність із джерелом вашого проекту. Але обидва ці рішення насправді є хибними.

Чому не слід застосовувати підхід "Встановити до локальної репо"

Коли ви встановлюєте залежність до свого локального сховища, він залишається там. Ваш артефакт розповсюдження буде добре, доки він матиме доступ до цього сховища. Проблема полягає в тому, що в більшості випадків це сховище буде знаходитися на вашій локальній машині, тому не можна буде вирішити цю залежність від будь-якої іншої машини. Очевидно, що ваш артефакт залежить від конкретної машини - це не спосіб вирішити справи. Інакше цю залежність доведеться встановлювати локально на кожній машині, що працює з тим проектом, що не є кращим.

Чому не слід застосовувати підхід "Система"

Банки, від яких залежать підходи до системи "Обсяг системи", не встановлюються в будь-яке сховище або додаються до ваших цільових пакетів. Ось чому ваш розповсюджувальний пакет не матиме способу вирішити цю залежність при використанні. На мою думку, це було причиною того, що використання сфери застосування системи навіть застаріло. У будь-якому випадку ви не хочете покладатися на застарілу функцію.

Статичне рішення в сховищі проекту

Після цього введіть це pom:

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

для кожного артефакту з ідентифікатором групи форми x.y.zMaven буде містити таке місце розташування всередині вашого проекту проекту в пошуках артефактів:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

Детальніше про це ви можете прочитати у цьому дописі .

Використовуйте Maven для встановлення для проекту РЕПО

Замість того, щоб створити цю структуру вручну, я рекомендую використовувати плагін Maven, щоб встановити ваші банки як артефакти. Отже, щоб встановити артефакт до сховища проекту, під repoпапкою Execute:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

Якщо ви виберете цей підхід, ви зможете спростити декларацію сховища pomдо:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

Довідковий сценарій

Оскільки виконання команди встановлення для кожної lib набридає і, безумовно, схильна до помилок, я створив скрипт утиліти, який автоматично встановлює всі банки з libпапки в сховище проекту, при цьому автоматично розв’язуючи всі метадані (groupId, artifactId тощо) з назви файлів. Сценарій також роздруковує залежності xml для копіювання та вставки у свій файл pom.

Включіть залежності у свій цільовий пакет

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

Для подолання цієї проблеми я пропоную включити ці залежності у свій цільовий пакет. Це ви можете зробити з плагіном зборки або краще з плагіном OneJar . Офіційний документальний фільм на OneJar легко зрозуміти.


3
Я завжди припускав, що ви можете створити сховище в проекті, нарешті підтвердив це, чудово!
Альффан

19
Дві речі, які слід зазначити: 1) Я рекомендую використовувати "$ {project.baseUri} repo" замість "файл: // $ {project.basedir} / repo", щоб отримати RFC-сумісний URL також у Windows. 2) Якщо ви структуруєте свій проект у підмодулі, такий підхід здається невдалим, оскільки $ {project.baseUri} отримує рішення у підкаталозі модуля. Будь-яка ідея, як вирішити цю проблему?
Олівер Ханаппі

8
Це мене мало не влаштувало, але сценарій Нікіти намагався бути дуже розумним із погано названими файлами JAR, які у мене були. Тому я зробив спрощену версію, яка не робить жодних здогадок для groupId: github.com/carchrae/install-to-project-repo
Tom Carchrae

3
така геніальна відповідь !! Є два способи зробити щось, правильний шлях та спосіб, який працює, ви, сер, робить це правильно!
Пантро

1
тут ви також знайдете інформацію про те, як автоматично генерувати артефакт з вашого файлу jar: devcenter.heroku.com/articles/local-maven-dependitions
Дірк

486

Тільки для викидання коду

встановіть систему range == та просто складіть groupId, artifactId та версію

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

Примітка: системні залежності не копіюються в результуючу банку / війну
(див. Як включити системні залежності до війни, побудованої за допомогою maven )


4
Дякую, це дійсно близько до того, що я хочу. Будь-який спосіб додати їх усіх як єдиний запис? Скажіть, у мене є / lib з 10 баночками, чи можу я їх якось додати, наприклад, з /some/path/*.jar для systemPath? чи мені все одно до кожного слід ставитися як до відомої залежності? І все-таки дуже близько до того, що мені потрібно, дякую!

11
використовуйте systemPath, подібний до цього: "<systemPath> $ {basedir} /lib/BrowserLauncher2-1_3.jar </systemPath>" $ {basedir} вказує на корінь вашого проекту.
Фредерік Морін

4
Краще використовувати проект. префікс у вашому шляху так: <systemPath> $ {project.basedir} /lib/AwesomeLib.jar </systemPath>
Меттью Маккаллоу

76
Хоча я розумію, що саме про це просила ОП, я все ж хочу підкреслити, що використання systemсфери застосування - це жахлива практика, яка сильно не рекомендується . Див. Залежність + сфери застосування .
Паскаль Thivent

6
@marioosh пам'ятаю, початковий намір питання був для швидкого експерименту. Якщо ви хочете зробити пакет mvn, встановіть банку в репо.
Піролістичний

64

Ви можете створити локальний сховище для свого проекту

Наприклад, якщо у вас є libsпапка в структурі проекту

  • У libsпапці слід створити структуру каталогів:/groupId/artifactId/version/artifactId-version.jar

  • У своєму pom.xml слід зареєструвати сховище

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
  • і додайте залежність, як зазвичай

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>

Це все.

Для детальної інформації: Як додати зовнішні бібліотеки в Maven


1
Ви відповідаєте майже правильно. GroupId слід розділити на серральні підкаталоги.
Пітер Фортуін

5
Звичайно, якщо у вас є складний groupId, наприклад "com.foo.bar", структура вашої директорії повинна бути /com/foo/bar/artifactId/version/artifactId-verion.jar
Дмитро Бойченко

Чи це суттєво відрізняється від відповіді, яка була на рік раніше ?
Джошуа Тейлор

В останньому каталозі, де знаходиться файл jar, вам також потрібно додати відповідний файл pom xml.
Федеріко

30

Примітка. При використанні області застосування системи ( як зазначено на цій сторінці) ) Maven потребує абсолютних шляхів.

Якщо ваші банки знаходяться під коренем проекту, вам потрібно буде встановити значення systemPath за допомогою $ {basicir}.


15

Це те, що я зробив, він також працює навколо проблеми з пакетом, і він працює з перевіреним кодом.

Я створив нову папку в проекті у своєму випадку, який я використовував repo, але не соромтеся використовуватиsrc/repo

У моїй POM я мав залежність, якої немає в жодних сховищах громадських Maven

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

Потім я створив наступні каталоги repo/com/dovetail/zoslog4j/1.0.1та скопіював файл JAR у цю папку.

Я створив наступний файл POM для представлення завантаженого файлу (цей крок є необов’язковим, але він видаляє ПЕРЕКЛЮЧЕННЯ) і допомагає наступному хлопцеві зрозуміти, з чого я отримав файл.

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

Я створюю два необов'язкові файли - контрольні суми SHA1 для POM та JAR для видалення відсутніх попереджень контрольної суми.

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

Нарешті я додаю наступний фрагмент до мого pom.xml, який дозволяє мені звернутися до локального сховища

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>

Привіт, ти помістив файли пам’яті в локальне сховище або поруч із своїми jar-файлами?
Пейманх

У наведеному вище рішенні це було поруч із файлами JAR. Зауважте, що мені не подобається рішення вище, оскільки це занадто багато роботи.
Архімед Траяно

Я все ще віддаю перевагу тому рішення, яке я розмістив тут stackoverflow.com/questions/2229757/…
Архімед Траяно

Мені подобається такий підхід, хоча я використовував плагін Maven install для автоматизації встановлення банку в локальний репо.
Карл Г

13

Вам справді слід встановити рамку через сховище та визначити свої залежності залежно. Використання сфери застосування системи є поширеною помилкою, яку люди використовують, оскільки їм "не важливо керувати залежністю". Проблема полягає в тому, що виконуючи це, ви закінчитеся зі збоченим складом Maven, який не покаже Maven у нормальному стані. Ви б краще наступний підхід , як це .


12

Так ми додаємо або встановлюємо локальну банку

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

Я дав деякі за замовчуванням groupId та artifactId, оскільки вони є обов'язковими :)


11

У плагіні Maven install використовується командний рядок, щоб встановити банку в локальне сховище, POM необов’язковий, але вам доведеться вказати GroupId, ArtifactId, Версію та Упаковка (усі матеріали POM).


насправді, це те, що вам не потрібно створювати пам’яті для бібліотеки, яку ви імпортуєте у своє місцеве сховище
Фредерік Морін,

5
-1, іноді ви просто хочете додати jar-файл без проблем встановити його.
Леонель

8

Використання <scope>system</scope>- це жахлива ідея з причин, пояснених іншими, встановлення файлу вручну у вашому локальному сховищі робить збірку невідтворюваною, а використання <url>file://${project.basedir}/repo</url>не є гарною ідеєю також тому, що (1) може бути не добре сформованою fileURL - адресою (наприклад, якщо проект перевіряється в каталозі з незвичайними символами), (2) результат є непридатним, якщо POM цього проекту використовується як залежність від чужого проекту.

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

Рекомендація

Використовуйте плагін не-maven-jar-maven-plugin . Робить саме те, про що ви просили, не маючи жодних недоліків інших підходів.


Також бачив плагін Maven-external-залежність, хоча плагін, який не є maven-jar-maven, здається більш простим у використанні.
Джессі Глік

8

Я знайшов інший спосіб це зробити, дивіться тут з поста Heroku

Підсумовувати (вибачте за копію та вставлення)

  • Створіть repoкаталог під кореневою папкою:
ваш проект
+ - пом.хмл
+ - src
+ - репо
  • Запустіть це, щоб встановити банку в локальний каталог репо
mvn розгорнути: розгорнути-файл -Durl = файл: /// шлях / до / вашпроект / repo / -Dfile = mylib-1.0.jar -DgroupId = com.example -DartifactId = mylib -Dpackaging = jar -Dversion = 1.0
  • Додайте це своє pom.xml:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>

6

Після довгого обговорення з хлопцями CloudBees щодо правильно виготовленої упаковки такого типу JAR, вони зробили цікаву гарну пропозицію щодо рішення:

Створення фальшивого проекту Maven, який приєднує попередньо існуючу JAR як основний артефакт, наштовхуючись на належну POM install: виконання-install виконання. Ось приклад такого роду POM:

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Але для його реалізації слід змінити існуючу структуру проекту. По-перше, ви повинні мати на увазі, що для кожного такого типу JAR повинен бути створений різний підроблений проект (модуль) Maven. І повинен бути створений батьківський проект Maven, включаючи всі підмодулі, які є: усі обгортки JAR та існуючий основний проект. Структура може бути:

кореневий проект (він містить батьківський файл POM, включає всі підмодулі з модулем XML-елемент) (упаковка POM)

JAR 1 обгортка Maven child project (упаковка POM)

JAR 2 обгортка Maven child project (упаковка POM)

основний існуючий проект для дитини Maven (WAR, JAR, EAR .... упаковка)

Коли батьків працює через mvn: install або mvn: пакування примусово, і підмодулі будуть виконані. Це може сприйматись як мінус, оскільки структура проекту повинна бути змінена, але в кінці кінців пропонує нестатичне рішення


Просто спостереження, але я не думаю, що вам потрібно створювати нову POM для кожного JAR, який ви хочете додати. Повинно бути достатньо, щоб створити єдину POM, щоб додати всі JAR, якщо у вас є блок виконання для кожної банку, яку ви хочете додати. Вам просто потрібно переконатися, що кожен блок має унікальний ідентифікатор. Результат - це єдиний модуль Maven, який додасть усі JAR-адреси до локальної репо. (Просто переконайтесь, що координати Maven не стикаються ні з чим, що вже може бути там або може бути додано пізніше!)
Stormcloud

Герой. Це ТОЧНО те, що я хотів. Хороший друг. 2013 рік, мабуть, був хорошим роком;)
nttreviv

5

Що мені здається найпростішим - це просто налаштувати ваш плагін maven-компілятор, щоб він включав ваші власні банки. Цей приклад завантажить будь-які файли jar в каталог lib.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <includes>
                    <include>lib/*.jar</include>
                </includes>
            </configuration>
        </plugin>

1
Якщо я додам цю мавен says nothing to complile!
Раві Парех

Це говорить, all classes are up to date nothing to compileтому що більше не буде шукати *.java. Ви можете додати їх назад, використовуючи <include>**/*.java</include>. Але для мене банки не мають успіху
Michael Laffargue

@Imiguelmh, будь-яка причина, чому це не працює для банок?
kisna

4

Проблема systemPathполягає в тому, що банки залежно від розподілених артефактів не будуть розподілятися як перехідні. Спробуйте, що я тут розмістив: чи найкраще Mavenize ваші файли jar-файлів проекту або помістити їх у WEB-INF / lib?

Потім оголосити залежності як завжди.

І будь ласка, прочитайте примітку колонтитула.


3

Дивне рішення я знайшов:

за допомогою Eclipse

  • створити простий (неробочий) проект Java
  • додати Основний клас
  • додати всі банки на класний шлях
  • експортувати Runnable JAR (це важливо, тому що немає іншого способу зробити це)
  • виберіть Витягнути необхідні бібліотеки в створений JAR
  • вирішувати питання ліцензії
  • tadammm ... встановіть згенеровану банку на m2repo
  • додайте цю єдину залежність до інших проектів.

ура, Балінт


3

Якщо ви хочете швидкого і брудного рішення, ви можете зробити наступне (хоча я не рекомендую це для нічого, крім тестових проектів, maven довго скаржиться, що це не правильно).

Додайте запис залежності для кожного потрібного файлу jar, бажано, за допомогою сценарію perl або чогось подібного та скопіюйте / вставте його у свій файл pom.

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";

Так, саме це я шукав. Спосіб просунути його для дослідницького тестового коду. Нічого фантазійного. Так, я знаю, що це всі кажуть :) Різні рішення плагінів Maven здаються непосильними для моїх цілей. У мене є кілька баночок, які мені подавали як сторонні лібки з файлом pom. Я хочу, щоб він швидко склався / запустився. Це рішення, яке я банально адаптував до пітона, творило для мене чудеса. Вирізати і вклеїти в мою пом.
Павло

3

Швидке і брудне рішення партії ( на основі відповіді Алекса):

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

Виконати це так: libs.bat > libs.txt. Потім відкрийте libs.txtта скопіюйте його вміст у залежності.

У моєму випадку мені потрібні були лише бібліотеки для складання мого коду, і це рішення було найкращим для цієї мети.


2

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

  1. Банки, які не можна знайти в інтернет-сховищі Maven, повинні бути у SVN.
  2. Якщо один розробник додає іншу бібліотеку, іншим розробникам не слід заважати встановлювати їх вручну.
  3. IDE (NetBeans в моєму випадку) повинен мати можливість знайти джерела та javadocs для надання автодоповнення та допомоги.

Давайте поговоримо спочатку про (3): Просто мати банки в папці і якось об'єднати їх у остаточну банку тут не вийде, оскільки IDE цього не зрозуміє. Це означає, що всі бібліотеки мають бути встановлені належним чином. Однак я не хочу, щоб усі встановлювали його за допомогою "mvn install-file".

У моєму проекті мені знадобився метавіджет. Ось і ми:

  1. Створіть новий проект Maven (назвіть його "shared-libs" чи щось подібне).
  2. Завантажте метавіджет і витягніть поштовий індекс у src / main / lib.
  3. Папка doc / api містить javadocs. Створіть блискавку вмісту (doc / api / api.zip).
  4. Змініть пам’ятку так
  5. Створіть проект, і бібліотека буде встановлена.
  6. Додайте бібліотеку як залежність до свого проекту або (якщо ви додали залежність у проекті спільних ліб), додайте спільні-libs як залежність, щоб отримати всі бібліотеки одночасно.

Кожен раз, коли у вас є нова бібліотека, просто додайте нове виконання і скажіть усім, щоб знову створити проект (ви можете покращити цей процес за допомогою ієрархій проектів).


Ви можете перевірити Maven: додайте залежність до jar за відносним шляхом (що IMHO - краща альтернатива).
Паскаль Thivent

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

У моїй відповіді є спосіб розповісти pom.xml про баночку всередині вашого проекту. Чому б просто не зробити це і вказати на банки в $ {basedir} / lib?
Ед Браннін

1
@Ed Оскільки це абсолютно не те, що стосується сфери роботи системи, залежність від системної області має безліч побічних ефектів. Це жахлива практика, яку слід повністю заборонити.
Паскаль Thivent

2

Щоб встановити сторонню банку, яка не знаходиться у сховищі Maven, використовуйте maven-install-plugin.

Нижче наведено етапи:

  1. Завантажте файл jar вручну з джерела (веб-сайту)
  2. Створіть папку і помістіть у неї ваш jar файл
  3. Запустіть команду нижче, щоб встановити сторонню банку в локальному сховищі Maven

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

Нижче, наприклад, я використовував його для simonsite log4j

mvn install: install-file -Dfile = / Користувачі / athanka / git / MyProject / repo / log4j-rolling-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-rolling-appender -Dversion = 20150607-2059 - Розпакування = баночка

  1. У pom.xml включіть залежність, як показано нижче

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
  2. Запустіть команду mvn clean install для створення вашої упаковки

Нижче наведено посилання:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


Це відповідь лише для прикордонних посилань . Ви повинні розширити свою відповідь, щоб включити сюди якомога більше інформації, а використовувати посилання лише для довідки.
Goodbye StackExchange

2

Для тих, хто тут не знайшов гарної відповіді, саме це ми робимо, щоб отримати банку з усіма необхідними залежностями. Ця відповідь ( https://stackoverflow.com/a/7623805/1084306 ) згадує використання плагіна Maven Assembly, але насправді не дає прикладу у відповіді. І якщо ви не прочитаєте все до кінця відповіді (вона досить тривала), ви можете її пропустити. Додавання нижче до вашого pom.xml призведе до генеруванняtarget/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>

1

Я натякав на якийсь код python у коментарі до відповіді від @alex lehmann, тож розміщую його тут.

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

0

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

Сподіваюсь, це допомагає.


1
Це я робив, і це працює, але це також забруднює шлях глобального класу, і я намагаюся піти від нього. Дякую!

@purple Точно як ти це зробив?
TheRealChx101

0

У нашому проекті працює те, що написав Архімед Траяно, але в нашому .m2 / settings.xml було щось подібне:

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

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


0

Я просто хотів швидкого та брудного вирішення ... Я не міг запустити сценарій від Микити Волкова: синтаксична помилка + для строку імен jar потрібен строгий формат.

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

Якщо ви хочете використовувати його, переконайтеся, що ви розумієте, що робить сценарій, можливо, вам доведеться змінити libпапку та значення для groupIdабо artifactId...

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '>', 'dependencies.xml') or die "Could not open file 'dependencies.xml' $!";
foreach my $file (glob("lib/*.jar")) {
    print "$file\n";
    my $groupId = "my.mess";
    my $artifactId = "";
    my $version = "0.1-SNAPSHOT";
    if ($file =~ /\/([^\/]*?)(-([0-9v\._]*))?\.jar$/) {
        $artifactId = $1;
        if (defined($3)) {
            $version = $3;
        }
        `mvn install:install-file -Dfile=$file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar`;
        print $fh "<dependency>\n\t<groupId>$groupId</groupId>\n\t<artifactId>$artifactId</artifactId>\n\t<version>$version</version>\n</dependency>\n";
        print " => $groupId:$artifactId:$version\n";
    } else {
        print "##### BEUH...\n";
    }
}
close $fh;

0

Рішення для області застосування = "системний" підхід на Java:

public static void main(String[] args) {
        String filepath = "/Users/Downloads/lib/";
        try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {

        List<String> result = walk.filter(Files::isRegularFile)
                .map(x -> x.toString()).collect(Collectors.toList());

                String indentation = "    ";
                for (String s : result) {
                    System.out.println(indentation + indentation + "<dependency>");
                    System.out.println(indentation + indentation + indentation + "<groupId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</groupId>");
                    System.out.println(indentation + indentation + indentation + "<artifactId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</artifactId>");
                    System.out.println(indentation + indentation + indentation + "<version>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</version>");
                    System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
                    System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
                    System.out.println(indentation + indentation + "</dependency>");
                }

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