Каков наилучший способ разрешения зависимостей между проектами Java?

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

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

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

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

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

8 ответов


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


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

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


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

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

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

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


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

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

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

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

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


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

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

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

или

зависимость mvn: tree-Dverbose=true

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


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

затем добавить B_C.jar по классной дорожке...


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

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


бесплатные книги maven:

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