Maven: лучший способ связать пользовательский внешний JAR с моим проектом? - PullRequest
131 голосов
/ 17 апреля 2011

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

Спасибо!

Ответы [ 14 ]

189 голосов
/ 04 июля 2012

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

59 голосов
/ 17 апреля 2011

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

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

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

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

27 голосов
/ 22 апреля 2014

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

Например:

 <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

26 голосов
/ 17 апреля 2011

В руководстве Maven сказано сделать это:

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar
22 голосов
/ 08 мая 2013

обновление С тех пор мы только что установили наш собственный сервер 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/ и поместите в нее файл 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

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

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
    
  5. Наслаждайтесь

11 голосов
/ 22 октября 2011

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

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

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

6 голосов
/ 15 июля 2017

Maven способ добавления банок non 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>

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

4 голосов
/ 31 марта 2017

Если вы столкнулись с той же проблемой и используете подпружиненную загрузку 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, чтобы включить банку в путь / 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>

Удачи!

4 голосов
/ 28 июля 2016

Измените systemPath .

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>
3 голосов
/ 19 мая 2018

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

<repository>...</respository> 

, требуются внешние

<repositories>...</repositories> 

теги, включающие в себя.Это не ясно из некоторых примеров.

...