Estudio de los servidores Web OSGi (2011)
Un módulo, en el área del desarrollo de software, se puede definir como una parte autosuficiente de un sistema mucho mayor, y las características de un buen módulo están dadas por tener alta cohesión, es decir que todos los elementos del módulo tienen la tarea de solucionar o brindar una funcionalidad en común, y un bajo acoplamiento, es decir que los elementos del módulo dependen poco o nada de otros elementos que existan en un módulo diferente. Actualmente la modularidad en Java está definida por la noción de “paquetes”, los cuales son agrupaciones de clases. Estas clases a su vez, al igual que los métodos en ellas, tienen modificadores que controlan su visibilidad (public, protected, private). Para que cierta parte del código sea visible de un paquete a otro, este debe ser declarado public, lo que hace que dicho código sea accesible a cualquier otro paquete, lo cual conlleva a exponer detalles de la implementación. Incluso si el diseño de una aplicación hace que esta esté idealmente organizada, es decir, que todas las clases e interfaces están idealmente organizadas en paquetes sin que exista la falla expuesta en el párrafo anterior, que existan capas funcionales en la aplicación, que se utilice una herramienta para la Inyección de Dependencias tal como Spring, o incluso que el proyecto como tal esté dividido en diferentes proyectos de compilación; al final toda la aplicación tiene que ser implementada en un único archivo WAR, y esto no es realmente modularidad