Ответ на Ваш вопрос действительно зависит от того, что вы имели в виду под "модульным" .
Существует несколько уровней проблем, которые необходимо учитывать при создании модульного приложения.
Прежде всего вы должны рассмотреть, является ли «модульность», которую вы ищете, модульность архитектуры , модульность времени развертывания или модульность времени выполнения .
В любом случае каждый последующий уровень подразумевает все предыдущие уровни.
Для начала - чтобы сделать ваше приложение модульным, вы должны начать с архитектуры. Разделите ваши проблемы на четко определенные чистые детали, которые имеют четко определенные интерфейсы с «внешним миром». Использование хороших шаблонов проектирования и внедрение зависимостей и проектирование для тестируемости устройства имеют большое значение для достижения хорошего разделения проблем, которое является основой модульного дизайна.
Начните с малого, но имейте в виду большую картину. При проектировании немного более крупных блоков (или модулей) вашей системы убедитесь, что они имеют как можно меньше перекрывающихся областей. Каждый модуль не должен делать никаких предположений об окружающей среде, в которой он работает, и обслуживает только одну проблему. Любые сервисы, которые ему требуются от своих коллег, должны быть явно предоставлены внешней инициализацией (предпочтительно используя внедрение зависимостей для склейки модулей вместе в работающее приложение).
Если ваша архитектура является модульной, легко разделить задачи на собственные единицы развертывания (в виде проектов , jars , связок, подключаемых модулей , расширений или чего-либо другого), и вы можете легко начать смешивать и сопоставлять различные модули во время развертывания, чтобы получить точный набор функций, необходимый для конкретного экземпляра приложения. Это то, что я имею в виду под модульностью времени развертывания .
Для обеспечения модульности времени развертывания очень важны Внедрение зависимостей фреймворки типа Guice , Spring framefork и другие.
Модульность времени выполнения с моей точки зрения это похоже на модульность, предоставляемую плагинами Eclipse и NetBeans или расширениями Mozilla, где вы можете изменить конфигурацию и набор модулей приложения после развертывания / установки.
Это подразумевает некую архитектуру и инфраструктуру, которая распознает новые плагины / расширения либо во время инициализации приложения, либо динамически во время выполнения.
Последнее также означает, что все ваши модули должны быть собраны с неявным предположением, что любая служба, которую использует модуль, может легко исчезнуть в любой момент времени, прилагая дополнительные усилия для обеспечения устойчивости кода, работающего в этом изменчивом мире.