Maven: лучший способ связать пользовательский внешний JAR с моим проектом?


151

Это моя первая пара дней, изучающих Maven, и я все еще борюсь с основами. У меня есть внешний файл .jar (недоступный в общедоступных репозиториях), на который мне нужно сослаться в моем проекте, и я пытаюсь выяснить, какой мой лучший вариант.

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

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

2) Я все еще не могу, чтобы Eclipse видел зависимость. Я вручную добавил его в раздел pom, и он хорошо отображается в списке зависимостей в 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чтобы заполнить ваш локальный репозиторий библиотечными файлами jar, тогда вы должны изменить область действия от системы к компиляции.

Если вы начинаете с maven, я предлагаю использовать maven напрямую, а не плагины IDE, поскольку это добавляет дополнительный уровень сложности.

Что касается ошибки, вы помещаете требуемые фляги в свой путь к классу? Если вы используете типы из библиотеки, вы должны иметь доступ к ним также во время выполнения. Это не имеет ничего общего с самим Maven.

Я не понимаю, почему вы хотите поставить библиотеку под контроль исходного кода - она ​​предназначена для исходного кода, а не для двоичных файлов.


36
для больше на mvn install::install-file: mkyong.com/maven/…
Дуг Т.

7
Использование mvn install::install-fileв вашем локальном репозитории означало бы, что любой, кто клонирует ваш исходный код, должен будет также выполнить этот шаг вручную. В противном случае сборка будет нарушена «из коробки»
Isen Ng

это не добавит банку в файл войны.
Прачи

207

Вы можете создать In Project Repository, чтобы вам не приходилось 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 package» - отсутствует POM для проекта <имя-зависимости>, информация о зависимостях отсутствует.
Джинеш Гоэль,

Это лучшее решение для тех случаев, когда вам нужно добавить один или несколько файлов jar. Спасибо.
Антонио Сесто

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

2
Мне пришлось использовать файл: /// $ {project.basedir} / libs (3 переадресованных слеша) вместо file: // $ {project.basedir} / libs
Loc Phan

2
Если устанавливаемый jar не является скомпилированным jav-файлом maven, вам также потребуется добавить новый файл pom для определения метаданных. Чтобы избавить себя от всех этих ручных проблем, я бы порекомендовал использовать, mvn install:install-fileа затем скопировать всю структуру каталогов из локального репозитория в репозиторий внутри проекта.
Isen Ng

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_dependencies.htm


Этот метод работает очень хорошо, когда у вас есть только Eclipse Embedded Maven, и у вас нет установочного плагина (автономная система), поэтому вы не можете запустить installцель в зависимом проекте. Наличие системы с воздушным зазором и наличием всех плагинов, кроме плагина установки, является довольно редкой ситуацией.
Кардин Ли Дж.

1
Самый чистый и легкий.
Аджай Кумар

как добавить локальный путь зависимости, который находится вне папки $ {project.basedir}, как я хочу, чтобы путь $ {basedir} \ src \ lib \ ldapjdk.jar был на 1 уровень выше в другой папке
Навин Кумар

Я получаю ошибку -"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 .
    с. Проверьте это, пытаясь загрузить банку из браузера (в нашем случае: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. Вопреки тому, что люди сказали здесь, вы можете поместить внешний jar-файл в папку в вашем извлеченном каталоге проекта, и Maven найдет его, как и другие зависимости. Вот два важных шага:

  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 Project и не 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>

Список литературы Примечание Я владелец блога


Как узнать версии jar-файлов и подключаемого модуля maven?
ос

версии банок только что подготовлены, последние версии плагинов для maven install
craftsmannadeem

7

Если вы столкнулись с той же проблемой и используете spring-boot v1.4 + , вы можете сделать это следующим образом.

Есть includeSystemScope , который можно использовать для добавления зависимостей области системы в jar.

например

Я использую драйвер оракула в свой проект.

<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, это решение позволяет избежать ручной установки JAR на сервере 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 рассмотрит ваш локальный репозиторий, чтобы попытаться найти зависимость, соответствующую вашему артефакту. Кроме того, вы не должны использовать системные атрибуты scope или systemPath, обычно они зарезервированы для вещей, которые находятся в JDK, а не в JRE.

Посмотрите этот вопрос о том, как установить артефакты Maven.


3

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

<repository>...</respository> 

требуют внешнего

<repositories>...</repositories> 

теги Это не ясно из некоторых примеров.


2

Лучшее решение здесь - установить репозиторий: Nexus или Artifactory. If дает вам место для размещения подобных вещей, а в дальнейшем это ускоряет процесс, кэшируя ваши вещи извне.

Если вы имеете дело с открытым исходным кодом, вы также можете рассмотреть возможность размещения в центральном.

Смотрите руководство .


1

С Eclipse Oxygen вы можете делать следующие вещи:

  1. Поместите свои библиотеки в WEB-INF / lib
  2. Проект -> Настроить путь сборки -> Добавить библиотеку -> Библиотека веб-приложений

Maven возьмет их при установке проекта.


3
Если я это сделаю, другие пользователи, которые тянут мой проект, должны сделать то же самое в Eclipse?
Cruxi

0

Если внешний jar-файл создается только проектом Maven, вы можете скопировать весь проект в вашей системе и запустить

mvn install

в каталоге проекта. Это добавит jar в каталог .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>

Тогда вам придется добавлять классы индивидуально при выполнении через командную строку.

Вы можете добавить внешние jar с помощью следующей команды, описанной здесь

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

0

Наиболее эффективный и чистый способ решения этой проблемы - использование пакетов Github.

  1. Создайте простой пустой публичный / приватный репозиторий на GitHub согласно вашему требованию, хотите ли вы, чтобы ваш внешний jar был публично размещен или нет.

  2. Запустите команду ниже maven, чтобы развернуть ваш внешний jar в вышеупомянутом репозитории 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

    Приведенная выше команда развернет ваш внешний jar в репозитории GitHub, упомянутом в -Durl=. Вы можете сослаться на эту ссылку на Как развернуть зависимости как на GitHub Packages GitHub Package Deployment Tutorial

  3. После этого вы можете добавить зависимость , используя groupId, artifactIdи versionупомянутые в указанной выше стадии в мавена pom.xmlи запуститьmvn install

  4. Maven получит зависимость внешнего jar-файла из реестра GitHub Packages и предоставит его в ваш проект maven.

  5. Для того, чтобы это работало, вам также нужно настроить maven's settings.xmlдля получения из реестра GitHub Package.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.