it-swarm.com.ru

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

Это моя первая пара дней изучения 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, отредактированный, как указано выше?

Спасибо!

123
Alexandr Kurilin

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

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

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

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

58
stalker

Вы можете создать 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

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

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

187
Charlie Wu

Руководство Maven говорит сделать это:

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

Этого легко достичь, используя элемент <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

21
Jignesh Gohel

обновление С тех пор мы только что установили наш собственный сервер Nexus, намного проще и чище.

В нашей компании было несколько банок, которые были обычными, но не были размещены ни в каких репозиториях Maven, и мы не хотели, чтобы они были в локальном хранилище. Мы создали очень простое репозиторий mvn (public) на Github (но вы можете разместить его на любом сервере или локально):
note это идеально подходит только для управления несколькими редко меняющимися файлами 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 или частный сервер)
    а. Все, что вам нужно знать, это то, что файлы хранятся в шаблоне, упомянутом @glitch
    /groupId/artifactId/version/artifactId-version.jar
    б. На вашем хосте создайте папки, соответствующие этому шаблону.
    Т.е., если у вас есть файл jar с именем service-sdk-0.0.1.jar, создайте папку service-sdk/service-sdk/0.0.1/ и поместите в нее файл jar service-sdk-0.0.1.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. Наслаждаться

20
Kenny Cason

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

  1. Используйте «mvn install: install-file» с -DlocalRepositoryPath.
  2. Сконфигурируйте репозиторий, чтобы он указывал на этот путь в вашем POM.

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

11
Nehc

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

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

например.

Я использую драйвер 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>

Удачи!

5
chendu

Maven способ добавить не maven банок в проект maven

Maven Project и немавен банок

Добавьте плагины установки 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>

Отзывы Примечание Я владелец блога

5
craftsmannadeem

Измените ваш systemPath .

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

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

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

3
Tim Sparg

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

<repository>...</respository> 

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

<repositories>...</repositories> 

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

2
user3897528

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

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

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

2
bmargulies

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

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

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

0
Rick

Если внешний 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
Bug Killer