Какой лучший способ поделиться файлами JAR между несколькими проектами? - PullRequest
19 голосов
/ 13 июня 2009

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

У меня есть несколько идей, но у каждого из них есть свои недостатки:

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

Ответы [ 7 ]

22 голосов
/ 13 июня 2009

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

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

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

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

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

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

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


Обновление : уточнение вызвано комментариями

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

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

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

Ясность

Два объявления зависимостей ниже делают то же самое. Я нахожу Муравья намного яснее, чем Мавен.

Муравей Стиль:

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

Maven Style:

<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?
  • Что означает artifactId?
  • Откуда берется банка?
  • Где сейчас банка?
  • Что предусмотрено сфера? Кто это обеспечивает?
  • Как этот файл JAR оказался в моем файле WAR?
  • Почему у этой зависимости нет элемента версии?
  • Я не понимаю это сообщение об ошибке. Что на земле это значит?
  • Откуда этот файл с банкой? Я не заявлял об этом.
  • Почему у меня есть 2 версии одного и того же файла JAR на моем classpath?
  • Почему проект больше не строится? Ничего не изменилось с тех пор, как я в последний раз его построил.
  • Как добавить сторонний jar-файл, которого нет в репозитории Maven?
  • Скажите еще раз, откуда я взял этот плагин Eclipse.

Переходные зависимости

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

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

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

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

Я согласен. С тех пор, как я вернулся в Ant и перевел мои jar-файлы в систему контроля версий, я смог потратить намного меньше времени на решение проблем сборки.

Вот те вещи, на которые я трачу меньше времени:

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

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

18 голосов
/ 13 июня 2009

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


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

m2eclipse

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

IvyDE

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

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

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


Обновление (подсказано комментариями):

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

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

1 голос
/ 16 октября 2009

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

1 голос
/ 13 июня 2009

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

0 голосов
/ 13 июня 2009

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

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

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

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

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

0 голосов
/ 13 июня 2009

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

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

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

0 голосов
/ 13 июня 2009

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

...