Как лучше всего разрешить зависимости между проектами Java?

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

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

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

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

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


person c0d3x    schedule 18.12.2009    source источник
comment
Не уверен, почему это было отвергнуто, да и без комментариев. Это правильный вопрос, если немного левее новичка. Плохой тон.   -  person Dave Sims    schedule 18.12.2009


Ответы (8)


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

person Carl    schedule 18.12.2009
comment
Кроме того, если вы используете IntelliJ IDEA, встроенная интеграция с Maven просто фантастическая. - person danben; 18.12.2009
comment
Мы используем maven для большого проекта. Мне нравится, когда он настроен и работает правильно, однако во многих местах документация слабая, и у нее может быть крутая кривая обучения. Помните об этих проблемах, прежде чем идти по этому пути. - person Eric J.; 18.12.2009
comment
Если вы хотите узнать больше о Maven, здесь есть бесплатная электронная книга от sonatype: sonatype.com/Support/ Книги - person Kjellski; 05.12.2012

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

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

person BryanD    schedule 18.12.2009

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

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

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

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

person peter.murray.rust    schedule 18.12.2009

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

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

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

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

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

person PSpeed    schedule 18.12.2009

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

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

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

or

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

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

person grassbl8d    schedule 18.12.2009

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

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

person bushman    schedule 18.12.2009

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

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

person Shaun    schedule 18.12.2009

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

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

person Lumpy Oatmeal    schedule 22.12.2009