Правильный способ работы с внешними библиотеками на java (с использованием eclipse)

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

Итак, вот сделка; у меня больше математики / инженерного фона, чем чистый CS, поэтому у меня нет большого опыта в правильной/крупномасштабной разработке программного обеспечения, а скорее сценариев и алгоритмов. Теперь, когда я работаю над большим проектом, самостоятельно, я путать с некоторыми аспектами развития. Один из них работа с библиотеками/зависимостей

Я изначально создал папку под названием lib в моей папке проекта (в рабочей области Eclipse) и скопировал мои внешние библиотеки, а потом добавил их в путь сборки. Однако позже мне понадобились некоторые другие вещи, такие как JCommons, JFreeChart, Apache Commons Math etc.. Согласно инструкциям, эти библиотеки могут / должны быть включены в качестве пользовательских библиотек, что позволяет разработчик, чтобы увидеть документацию и исходный код из среды IDE (например, Eclipse). Надеюсь, до сих пор я все делал правильно...

так в чем проблема? Ну, во-первых, он появился, поскольку пользовательские библиотеки, упомянутые выше, не включены в SVN-копию проекта, а это означает, что мои коллеги, которые хотели протестировать мой проект, не могли этого сделать, просто приобретя проект из SVN. Теперь вторая фаза проблемы unsurfaced когда я изменил свою рабочую станцию на работе, я хотел импортировать мой проект в Eclipse из моей резервной копии, но тогда все, кроме этих пользовательских библиотек, есть. Чтобы сделать вещи более сложными, когда это программное обеспечение будет сделано, оно будет реализовано на сервере, поэтому было бы абсолютно лучше, если бы все могло быть упаковано в одну библиотеку или даже лучше runnable .

мне ранее советовали взглянуть на Maven или Ivy, но мое первоначальное понимание после проверки их обоих заключается в том, что они используются с самого начала и в основном для более сложных проектов. Честно говоря, я совершенно озадачен тем, как я должен управлять своими зависимостями. Есть идеи?

(Извините, что держу его долго, но я решил, что лучше полная и длинная, а затем неадекватная информация)

EDIT: мне удалось разобраться в проблеме; проблема, по-видимому, возникла из-за простого факта, что eclipse не копирует все ресурсы в одно место и инструкции по установке для некоторых библиотек на самом деле не предупреждает Вас о том, как Управлять библиотеками наилучшим образом.

спасибо всем, кто нашел время, чтобы попытаться помочь мне. Я буду со временем больше смотреть на такие проекты, как Maven и Ivy, это определенно интересный материал. Однако сейчас мне просто нужно вернуться к программному обеспечению в рабочее состояние, слишком долго боролся с новыми вещами.. :)

6 ответов


рискуя совершить акт ереси, я бы сказал, что Maven и wot-not здесь излишни. Вам нужны ваши зависимости в вашем проекте SVN, просто. Вы добавили папку lib в путь сборки в Eclipse, и это нормально. Но если вы специально не добавите содержимое папки lib в свой проект (как описывает Фред), эти элементы не будут иметь права на фиксацию в SVN-они будут просто ссылаться на путь к классам вашей настройки. Это хорошо для вас, ни для кого хотите проверить свой проект (как вы нашли).

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


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


хорошо, я думаю, что это можно решить..

в Eclipse на экране пути сборки java также есть выбор библиотек jar импорта, который позволяет вам выбрать папку проекта lib..на самом деле есть выбор с надписью Папка, я думаю..

другое дело, так как он будет развернут на сервере, вам придется иметь каждую банку в папке lib.

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


три варианта:

  • Maven (refcard) - очень мощный инструмент, но в то же время очень проста в использовании. Я использую его во всех своих проектах, какими бы маленькими они ни были. Это управление зависимостями + инструмент сборки в одном
  • Айви - очень похоже на maven, но это только инструмент управления зависимостями. Вам придется делать свои сборки с ant
  • committing jars & eclipse файлы проекта - это не портативный между IDEs, но на самом деле это не так ужасно и используется во многих проектах

обновление: несколько слов, объясняющих идеологию maven:

  • соглашение по конфигурации-вы структурируете свой проект предопределенным способом. Это не имеет отношения к управлению зависимостями, поэтому просто упомяните об этом.
  • репозитории-вот где находятся файлы jar. Они не находятся в вашем SVN, потому что у них есть отдельный механизм управления версиями и потому что они занимают много места.
  • IDEs интегрируются с maven. Например m2eclipse получает зависимости maven и добавляет их к пути сборки eclipse, что делает использование прозрачным
  • разрешение зависимостей - в pom.xml вы определить несколько <dependency> теги, с именем и версией, и maven извлекает все необходимые банки из удаленных репозиториев. Он также извлекает банки, от которых зависят ваши зависимости (транзитивные зависимости). Таким образом вы не в конечном итогеNoClassDefFoundException.

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


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

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

Что касается упаковки в одну банку - это возможно с Ant, но зачем вам это нужно?


в нашей компании у нас есть отдельный репозиторий SVN для сторонних библиотек, и у нас есть правило компании, что на каждой рабочей станции разработки этот репозиторий C:\dev - ... Таким образом, каждый из них имеет библиотеки в нужном месте, и проекты работают нормально.