На выбор:
- сохранить проект в одном модуле; и используйте необязательные зависимости.
- разбить проект на несколько модулей; где каждый модуль имеет (не обязательно) зависимость от любых библиотек;
Я думаю, что первое имеет больше смысла в большинстве случаев: пользователям нужно найти способ обходить меньшее количество артефактов. Как правило, им придется добавлять меньше новых зависимостей в их pom. Если код для поддержки сторонних проектов не является большим, это также поможет сократить время загрузки maven (меньше циклов). При последнем подходе вы можете оказаться в неловких ситуациях, когда пользователь определил свой собственный набор версий, но только для некоторых сторонних зависимостей.
Я предпочитаю видеть необязательные зависимости в pom (иногда я смотрю, для какой версии он построен). Это правда, что некоторые люди могут не смотреть. Я думаю, что копируемые и вставляемые фрагменты pom на сайте - лучшее решение для этого. Например, если у вас есть страница об интеграции Spring, вы можете поместить соответствующий фрагмент pom на эту страницу.
Я бы посоветовал хранить несвободные зависимости (или что-либо, что не так легко разрешается) в отдельном модуле maven, чтобы участники всегда могли создать основной артефакт. (У меня была эта проблема с Кварцем, который IIRC имеет необязательную зависимость от JAR-файла Oracle JDBC).
Редактировать: Если вы беспокоитесь о том, что пользователи видят ошибки NoClassDefFoundErrors, не помешает проверить, что класс может быть разрешен перед его использованием. Например, вы можете сделать исключение и выдать более значимое сообщение об ошибке, указывающее пользователю на документацию. SLF4J является хорошим примером этого.