Каков наилучший способ разрешения зависимостей между проектами Java? - PullRequest
8 голосов
/ 18 декабря 2009

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

В моем текущем случае я получил три Java-проекта A, B и C. Теперь A использует B и B использует C. Я использую Eclipse IDE и добавил B в путь компоновки A и C в путь компоновкиB. Теперь есть ошибка компилятора, что A не может разрешить что-то из C. Поэтому я должен добавить C в путь сборки B.

Так что, как лучше всего разрешить зависимости, сохраняя вашиПрограмма настолько независима, насколько это возможно от других проектов?

Я хотел бы знать, в целом и со ссылкой на мою текущую ситуацию.Есть ли лучшие способы сделать это?Т.е. в представлении конфигурации запуска / отладки есть настройки classpath, но я думаю, что они не помогут во время компиляции.

Заранее спасибо.

Ответы [ 8 ]

7 голосов
/ 18 декабря 2009

Это звучит как часть проблемы, установленной Maven. Используя Maven и Eclipse, а именно m2eclipse, вы можете иметь проекты, использующие другие проекты, и все разрешения зависимостей обрабатываются за вас.

2 голосов
/ 18 декабря 2009

Мне кажется, что вы делаете то, что должны, без использования инструмента управления зависимостями, такого как Ivy или Maven, который предоставляет вам возможность «транзитивного управления зависимостями». С помощью любого из этих инструментов вы можете просто указать, что A зависит от B, а B зависит от C, и они автоматически узнают, что A также потребуется C.

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

1 голос
/ 18 декабря 2009

без сомнения, вы должны использовать инструмент управления зависимостями, как уже отмечали люди ... хотя вручную, архивируйте B и C в B_C.jar. Проверьте, что зависимость B от C разрешена в банке.

Затем добавьте B_C.jar в путь к классам ...

1 голос
/ 18 декабря 2009

Используйте maven для управления вашими зависимостями, а затем используйте плагин зависимостей для просмотра зависимостей.

вы можете запустить

mvn зависимость: анализ

или

зависимость mvn: дерево -Dverbose = true

это вам очень поможет.

1 голос
/ 18 декабря 2009

Другие упоминали несколько хороших инструментов, вероятно, наиболее распространенным является maven. Плющ еще один, который больше ориентирован только на управление зависимостями. Лично я использую gradle, который обладает некоторыми из лучших функций под знакомой классной оболочкой ... который все еще развивается и местами документируется. ;)

Следует помнить, что эти инструменты обрабатывают транзитивные зависимости. В вашем примере C является транзитивной зависимостью A, потому что A зависит от B, который зависит от C. Некоторые из этих инструментов сборки будут обрабатывать этот тип зависимости по-разному, и это может вас удивить, когда вы меньше всего этого ожидаете.

Например, если A на самом деле ссылается на код из C, то есть: у него есть зависимость времени компиляции от C, то ваши настройки A-> B-> C будут работать в чем-то вроде Maven. С другой стороны, gradle также заставит вас объявить, что A зависит от C ... поскольку это так. Зависимости во время выполнения полностью разрешаются в любом случае.

Сюрприз наступает, когда вы транзитивно включаете что-то в течение нескольких месяцев, и часть вашего кода основана на аспектах C, и вы решаете, что вам больше не нужна зависимость от B. Внезапно ваш код не будет собран, пока вы не выясните, что вам нужна указанная зависимость A-> C. В этом примере это довольно просто обнаружить, но иногда это не так.

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

1 голос
/ 18 декабря 2009

Мы используем Maven, и это важно для наших проектов. Это хорошее время для изучения - зависимость от более чем 3 проектов может быть пугающей. Maven работает с версиями, поэтому, если по какой-либо причине вам необходимо зависеть от Foo.1.2.3, Maven гарантирует, что вы не получите неверную версию.

Однако это не тривиально. Если вы используете Netbeans, он встроен лучше, чем Eclipse, и может помочь вам в обучении. (Также проекты достаточно переключаются между двумя системами).

Maven поддерживает множество концепций в своем файле POM (pom.xml), включая информацию о лицензии, участников, аргументы и т. Д., Поэтому вы получаете гораздо больше, чем просто управление зависимостями. И поддерживает модульность проектов.

Не пропустите кривую обучения - вам нужно знать, как она работает. Но вы также найдете предыдущие вопросы SO, которые помогут

0 голосов
/ 22 декабря 2009

бесплатных книг по мавену:

http://www.sonatype.com/documentation/books

0 голосов
/ 18 декабря 2009

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

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

...