Як додати локальні файли jar (ще не входять у сховище Maven) безпосередньо в бібліотечні джерела мого проекту?
install-file
сценаріїв.
Як додати локальні файли jar (ще не входять у сховище Maven) безпосередньо в бібліотечні джерела мого проекту?
install-file
сценаріїв.
Відповіді:
Встановіть 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
Довідково
install:install-file
метиВи можете додавати локальні залежності безпосередньо (як це було зазначено в проекті 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 в моєму проекті, який не вміщується в сховище. Якщо цю функцію буде знято, ну тут є багато хороших відповідей, які я можу обрати згодом!
artifactId
і groupId
неправильно?
По-перше, я хотів би віддати подяку за цю відповідь анонімному користувачу 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, який ви не можете опублікувати.
${project.parent.basedir}
, схоже, ні до чого не вирішується, я використовував ${project.basedir}/..
і працював досконало.
<mirrorOf>*</mirrorOf>
.
Створіть нову папку, скажімо, 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]
local-maven-repo
включена (як дитина в цьому прикладі) у вашу вихідну папку
Мені б хотілося таке рішення - використовувати 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
кроку, а будь-якого іншого кроку, який вам подобається.
mvn initialize
раніше mvn package
: я не можу mvn initialize package
або ще намагається завантажити JAR з центрального репо. Чому це? Я думав, що це буде виконувати цілі / фази в порядку.
compile
), збірка не вийде.
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
<scope>system
зараз застаріло.
install:install-file
артефакт для місцевого репо і використовуйте його як "нормальну" залежність (зі сферою за замовчуванням compile
) або використовуйте рішення для сховища в проекті .
Так, ви можете мати, але це не гарна ідея.
Замість цього встановіть усі ці банки для Maven repos
Також Див
Справді швидкий і брудний спосіб - вказати на локальний файл:
<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>file:${basedir}</url>
як базовий URL.
Додайте свій власний локальний 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 так:
Один із способів - це завантажити його у свій власний менеджер сховищ Maven (наприклад, Nexus). Добре практично мати власного менеджера сховищ у будь-якому випадку.
Ще один приємний спосіб, який я нещодавно бачив, - це включити модуль встановлення Maven у свій життєвий цикл збірки: Ви заявляєте в POM, щоб встановити файли в локальне сховище. Це невеликий, але невеликий накладні витрати і жодного ручного кроку не передбачається.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
Звичайно, ви можете додати банки до цієї папки. Але, можливо, це не те, чого ви хочете досягти ...
Якщо вам потрібні ці банки для компіляції, перевірте це пов'язане питання: Чи можна додати банки до Maven 2 build classpath, не встановлюючи їх?
Крім того, перш ніж хтось запропонує це, НЕ використовуйте область застосування системи.
Ще один цікавий випадок, коли ви хочете мати у своєму проекті приватні баночки Maven. Можливо, ви захочете зберегти можливості Maven для вирішення перехідних залежностей. Рішення досить легко.
Додайте наступні рядки у файл 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>
Відкрийте папку .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 / сховище ), і ви закінчите.
Я думаю, що краще рішення цієї проблеми - використовувати плагін 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
місцеві банки будуть додані автоматично.
Я хочу поділитися кодом, куди ви можете завантажити папку, наповнену банками. Це корисно, коли постачальник не має загальнодоступного сховища і вам потрібно додати багато бібліотек вручну. Я вирішив створити .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"))
Здається, ваш код вказує, що підтримуватимуться лише спеціальні банки. Це не те, що нам потрібно: натомість купу сторонніх банок. Чи є у вас пропозиції, як встановити будь-яку банку таким чином?
Це короткий синтаксис для новіших версій:
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
Також погляньте на ...
<scope>compile</scope>
Maven залежності . Це за замовчуванням, але я виявив, що в деяких випадках явно встановлюю, що це поле також дозволяє Maven знаходити локальні бібліотеки в локальному сховищі.
Чомусь у веб-додатку, якому я надаю підтримку, ні рішення Алірези Фаттахі, ні рішення Дж. Дж. Романа не працювали коректно. В обох випадках компіляція йде нормально (вона бачить банку), але упаковка не вміщує банку всередині війни.
Єдиний спосіб, коли мені вдалося змусити його працювати, - поставити банку /src/main/webapp/WEB-INF/lib/
і потім поєднати її з рішенням Фаттахіса або Романа.
Зауважте, що НЕ обов'язково корисно використовувати місцеве репо. Якщо цей проект ділиться з іншими, тоді всі інші матимуть проблеми та питання, коли він не працює, і баночка не буде доступною навіть у вашій системі управління джерелами!
Хоча спільне репо - найкраща відповідь, якщо ви не можете цього зробити, то вбудовувати банку краще, ніж локальне репо. Вміст репо лише для локальних мереж може спричинити багато проблем, особливо з часом.
У вашому локальному сховищі ви можете встановити свою банку, видаючи команди
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
Перейдіть за цим корисним посиланням, щоб зробити те саме на веб-сайті mkyoung. Ви також можете перевірити Maven guide для того ж
Щоб встановити сторонню банку, будь ласка, зателефонуйте команді, як показано нижче
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
- 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. Налаштуйте 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. Це воно. Це автоматично не включає ці банки як основні залежності до вашого проекту.
Це другорядний момент, але іноді його легко пропустити.
У мене була така ж помилка для набору залежностей у моєму pom.xml, виявляється, версії залежностей не були вказані в pom.xml і згадувалися в батьківському сховищі. Чомусь деталі версії не синхронізуються з цим репо. Отже, я вручну вводив версії за допомогою тегу, і він працював як шарм. Трохи часу, необхідного для пошуку версій у батьківській програмі та вкажіть тут. Але це можна зробити лише для банок, які показують артефактидну помилку, і вона працює. Сподіваюся, що це комусь допоможе.
У Apache Maven 3.5.4 мені довелося додати подвійну пропозицію. Без подвійної цитати мені це не вийшло.
приклад: mvn install: install-file "-Dfile = розташування до файлу jar" "-DgroupId = ідентифікатор групи" "-DartifactId = ідентифікатор артефакту" "-Dversion = версія" "-Dpackaging = тип пакета"
yourproject
+- pom.xml
+- src
yourproject
+- pom.xml
+- src
+- repo
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
<repositories>
<!--other repositories if any-->
<repository>
<id>project.local</id>
<name>project</name>
<url>file:${project.basedir}/repo</url>
</repository>
</repositories>
<dependency>
<groupId>com.groupid</groupId>
<artifactId>myid</artifactId>
<version>1.0</version>
</dependency>
ЦЕ ВІДПОВІДЬ ТОЛЬКО для споживачів ECLIPSE:
Якщо ви використовуєте Eclipse, помістіть банку в lib /, клацніть правою кнопкою миші назву банку та натисніть "Додати до шляху складання". Eclipse створить "бібліотеки, на які посилаються", і розмістить вам банку
Це вирішило імпорт банку відразу в програмі для мене
.classpath
, але ваша mvn package
команда Maven буде брокером, як тільки ви почнете використовувати цю залежність, оскільки maven не має цього визначення, і це має бути лише вpom.xml