Подтвердить что ты не робот

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

Когда у вас есть несколько проектов, которые используют один и тот же набор JAR-библиотек, сложно включать одни и те же JAR снова и снова с каждым проектом. Если я работаю над 20 различными проектами, я бы предпочел не иметь 20 одинаковых точных наборов файлов JAR. Каков наилучший способ сделать все эти проекты (и новые проекты) ссылкой на один и тот же набор JAR?

У меня есть некоторые идеи, но каждый из них имеет некоторые недостатки:

  • Поместите все JAR в папку и каждый проект будет выглядеть в этой папке.
  • Используя Eclipse, создайте "Пользовательскую библиотеку" и каждый проект ссылается на эту библиотеку пользователей.
  • Создайте проект "Библиотека", который ссылается на каждый JAR, и каждый проект ссылается на этот проект библиотеки.
4b9b3361

Ответ 1

Используйте Maven или Ivy, чтобы обрабатывать эти общие банки. Если вы опасаетесь слишком сильно менять свои проекты, вы можете просто использовать Ivy для управления дополнительным классом для вас.


Оба имеют хорошие плагины Eclipse:

m2eclipse

контейнер класса Maven http://img229.imageshack.us/img229/4848/mavendependencies.png

IvyDE

контейнер IpathDE classpath http://img76.imageshack.us/img76/3180/cpnode.jpg

который я использовал с хорошими результатами.

Вы заметите, что оба они ссылаются на банки вне рабочей области, поэтому дублирование удаляется.


Обновить (вызвано комментариями):

Моя причина рекомендовать этот подход состоит в том, что я твердо верю, что проще и понятнее объявлять зависимости, а не вручную включать их. Существует небольшая разовая стоимость, связанная с этим - меньше для Айви, чем для Maven, но в конечном итоге она окупается.

Другим, меньшим преимуществом является обработка переходных и конфликтных зависимостей. Легко забыть, почему вам нужен этот commons-logging-1.1.jar в пути к классам и нужно ли обновлять до 1.1.1. И также не забавно тянуть во всех зависимостях, необходимых для, например, спящий + аннотация + Spring. Сосредоточьтесь на программировании, а не на строительстве.

Ответ 2

Верьте или нет, ваш "утомительный" подход, вероятно, самый простой, самый чистый и наименее трудоемкий подход.

Перед тем, как прыгать на побегу на мэве, вы должны подумать о том, что действительно не так, когда делаете то, что вы сейчас делаете. Вы упомянули, что это утомительно и что у вас много файлов с баночками. Я создал процесс сборки на большом многомодульном проекте, используя Maven, а затем провел следующие 18 месяцев, сражаясь с ним постоянно. Поверьте мне, это было утомительно, и вокруг лежало много фляг.

С возвращением к Ant и передачей банок в исходное управление вместе с проектами, которые ими пользуются, он был намного более плавным.

Я храню кучу файлов jar в одном каталоге на моей машине, а затем, когда я создаю новый проект или вам нужно добавить новую банку в существующий проект, требуется всего около 30 секунд:

  • Скопируйте банку из JAR_REPO в проект lib dir.
  • Добавить jar в build.properties
  • Добавить jar в classpath в файле build.xml
  • Добавить jar для создания пути в Eclipse.

В ходе проекта эти 30 секунд незначительны, но это означает, что у меня есть проект, который можно проверить из источника управления и просто работать, не требуя какой-либо настраиваемой конфигурации Eclipse или установки Maven или пользовательской настройки.

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


Обновить: пояснение, запрошенное комментариями

@Robert Munteanu: Спасибо за отзывы и обновленные комментарии. Это может показаться немного спорным, но я боюсь, что не могу согласиться с вами, что Maven проще и понятнее, или что это сэкономит ваше время в долгосрочной перспективе.

От вашего сообщения:
"Я твердо верю, что проще и проще декларировать зависимости, а не вручную включать их. Существует небольшая одноразовая стоимость, связанная с этим - меньше для Айви, чем для Maven, но в конечном итоге она окупится".

Может быть, проще, если Maven загрузит файл jar для вас, чем загрузить его самостоятельно, но это единственное преимущество. В противном случае Maven не проще, неяснее, и его сложности и ограничения будут стоить вам в конечном итоге.

Ясность

Ниже перечислены две приведенные ниже описания зависимостей. Я нахожу, что Ant намного яснее, чем Maven.

Ant Стиль:

<path id="compile.classpath">  
    <pathelement location="${log4j.jar}" />
    <pathelement location="${spring.jar}" />
</path>  

Стиль Maven:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>${log4j.version}</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    <version>${spring.version}</version>
    <scope>compile</scope>
</dependency>

Простота

С версией Ant вы можете навести курсор на свойство ${log4j.jar}, и он покажет вам абсолютный путь к файлу jar. Вы можете искать использование compile.classpath. Там не намного больше, что вам нужно знать.

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

  • Что означает groupId?
  • Что означает артефакт?
  • Откуда появляется банка?
  • Где сейчас находится банка?
  • Что такое область? Кто его предоставляет?
  • Как этот файл jar попал в мой WAR файл?
  • Почему эта зависимость не имеет элемента версии?
  • Я не понимаю это сообщение об ошибке. Что на земле это означает?
  • Откуда на Земле появился этот файл jar? Я не заявлял об этом.
  • Почему у меня есть 2 версии одного и того же файла jar в моем пути к классам?
  • Почему проект больше не строится? Ничего не изменилось с момента последнего создания.
  • Как добавить стороннюю банку, которая не находится в репозитории Maven?
  • Скажите еще раз, откуда я получаю плагин Eclipse.

Транзитивные зависимости

"Другим, меньшим преимуществом является обработка транзитивных и конфликтных зависимостей".

По моему опыту, переходные зависимости - это больше проблем, чем они того стоят. Вы получаете несколько версий одного и того же файла jar, и в итоге вы получаете необязательные файлы jar, которые вам не нужны. Я закончил тем, что объявлял почти все, предоставляя возможность избежать хлопот.

Долгосрочная выплата

"Сосредоточьтесь на программировании, а не на построении".

Я согласен. Поскольку я возвращаюсь к Ant и помещаю свои файлы jar в исходный элемент управления, мне удалось потратить гораздо меньше времени на решение проблем сборки.

Это то, что я трачу меньше времени:

  • Чтение плохой документации Maven.
  • Чтение еще хуже документации Codehaus Mojo.
  • Настройка общих внутренних репозиториев.
  • Обучение членов команды.
  • Написание плагинов Maven для заполнения пробелов.
  • Попытка обходных дефектных плагинов (выпуск, сборка).
  • Установка плагинов Eclipse для Maven.
  • Ожидание, что плагин вернет мне контроль над Eclipse.

В любом случае, извините за длительную публикацию. Может быть, теперь, когда у меня это с моей груди, я могу принести некоторое закрытие моему долгому и мучительному опыту Maven.:)

Ответ 3

Это зависит от ваших потребностей, но есть несколько жизнеспособных вариантов. В моей работе используется внешняя папка, и все проекты ссылаются на эту папку, что упрощает работу в реальном времени за пределами eclipse. Пользовательская библиотека - это немного более привлекательный способ делать вещи, если вы не против легкой затмения. Я не вижу большой пользы для проекта библиотеки, но если у вас есть какой-то универсальный проект типа "util", который уже загружают все другие проекты, вы можете просто поместить все внешние банки в этот проект.

Ответ 4

Один из подходов состоит в том, чтобы поместить все ваши файлы jar в одном месте на вашем компьютере, в вашем eclipse ide, определить переменную среды, например LIB_LOCATION, которая указывает на этот каталог и использовать ваши проекты в банках относительно этой переменной. Таким образом, вы получаете легкость в использовании, а не множественные банки, переносимые на разных машинах, если у вас есть правильная переменная. Я пробовал maven для группы проектов достойного размера, и мне кажется, что я должен бороться, по крайней мере, так сильно, как раньше. Ошибки и проводное поведение в плагинах, m2eclipse и q4eclipse.

Ответ 5

Вы можете отредактировать "Установленные JRE", чтобы включить ваш JAR файл ( "Добавить внешние JAR файлы" ), добавить файл в каталог jdk\jre\lib\ext\или указать переменную среды CLASSPATH, содержащую путь к ней.

Ответ 6

Я бы рекомендовал проектный проект "library".

Но даже лучше - отдельный проект lib на внешний баннер - это позволяет отслеживать отпечатки между сторонними банками и знать, что нужно изменить при обновлении зависимости.

Удостоверьтесь, что вы проверяете эти проекты, поэтому все пользователи используют одни и те же версии сторонних библиотек и поэтому вы можете легко восстановить версию программного обеспечения (используйте теги/метки в своем контроле версий, чтобы группировать, какие версии проектов вместе)

Ответ 7

Мы решили более утомительный метод, но который позволяет нам иметь все в доме, но, вероятно, будет хорошо работать только для небольшого набора разработчиков.

Каждый набор файлов jar настраивается как проект Eclipse, названный соответствующим образом после набора jar, добавленного в путь сборки, исходные банки и javadoc jars, правильно установленные на каждой банке в пути сборки, и каждый проект затем включает в себя эту библиотеку проектов, необходимых для этого проекта. Получившаяся многопроектная рабочая область затем экспортируется как файл ProjectSet.psf, который затем может быть прочитан в необработанном Eclipse, возвращая всю рабочую область. Затем у нас есть все вышеупомянутые проекты в CVS, включая файлы jar.

Это работало очень хорошо или мы.

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

Также обратите внимание, что новый Eclipse 3.5, выходящий из этого соммера, будет иметь "Create Runnable Jar", который может выводить необходимые банки рядом с созданной runnable jar и правильно настроить линию Class-PAth в манифесте. Я ожидаю, что это будет большая экономия времени - проверьте это.