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

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

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

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

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

Спасибо!

Ответ 1

Я думаю, вы должны использовать mvn install:install-file для заполнения локального репозитория библиотечными банками, тогда вы должны изменить область действия системы для компиляции.

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

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

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

Ответ 2

Вы можете создать репозиторий In Project, поэтому вам не нужно 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

подробно прочитайте это сообщение в блоге

http://charlie.cu.cc/2012/06/how-add-external-libraries-maven/

Ответ 3

Руководство Maven говорит об этом:

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

Ответ 4

Это можно легко достичь, используя <scope> элемент, вложенный внутри < зависимость > элемент.

Например:

 <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

Ответ 5

update Мы с тех пор просто установили собственный сервер Nexus, намного проще и чище.

В нашей компании у нас были несколько банок, которые мы использовали в некоторых баночках, но не размещались в каких-либо репозиториях maven, и мы не хотели иметь их в локальном хранилище. Мы создали очень простой mvn (публичный) репо на Github (но вы можете разместить его на любом сервере или локально):
заметьте, что это только идеально подходит для управления несколькими редко файлами jan chaning

  • Создать репо на GitHub:
    https://github.com/<user_name>/mvn-repo/

  • Добавить репозиторий в pom.xml
    (Обратите внимание, что исходный файл полного пути будет немного отличаться от имени репо)

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

  • Добавьте зависимость от вашего файла pom.xml:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
    
  • Enjoy

Ответ 6

Не используйте systemPath. Вопреки тому, что говорили здесь люди, вы можете поместить внешнюю банку в папку под вашим каталогом проектов с извлеченными ресурсами, а Maven найдет ее как другие зависимости. Вот два важных шага:

  • Используйте "mvn install: install-file" с -DlocalRepositoryPath.
  • Настройте репозиторий, чтобы указать на этот путь в вашем POM.

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

Ответ 7

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>

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

Ответ 8

Измените systemPath .

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

Ответ 9

Если вы встретите ту же проблему, и используете 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>

тогда включите параметр systemScope = true, чтобы включить jar в путь /BOOT -INF/lib/**

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

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

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

Удачи!

Ответ 10

pom.xml собирается посмотреть на ваш локальный репозиторий, чтобы попытаться найти зависимость, которая соответствует вашему артефакту. Также вы не должны использовать атрибуты system scope или systemPath, они обычно зарезервированы для вещей, которые находятся в JDK, а не JRE

Посмотрите question, чтобы установить артефакты maven.

Ответ 11

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

Если вы имеете дело с открытым исходным кодом, вы также можете рассмотреть вопрос о включении в центр.

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

Ответ 12

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

<repository>...</respository> 

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

<repositories>...</repositories> 

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

Ответ 13

Если внешняя банка создается проектом 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>

Ответ 14

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

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

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