¿Cómo aborda normalmente los problemas de dependencia transitiva que se producen en tiempo de ejecución en grandes proyectos de software?
Durante las últimas tres semanas, he estado tratando de iniciar un componente de una gran pieza de software dentro de otro componente del software, pero muere de forma intermitente debido a problemas de dependencia transitiva que solo se conocen en tiempo de ejecución.
Por problemas de dependencia transitiva, me refiero a que ciertas dependencias de las dependencias de un proyecto determinado chocan con otras dependencias en tiempo de ejecución, causando inestabilidad o falla instantánea.
Hay cientos, cientos de dependencias en uso, y hay aproximadamente 50 subproyectos asociados con la herramienta en los que otros equipos trabajan de forma aislada, donde todos los módulos tienen dependencias profundamente anidadas entre sí. Nadie sabe para qué se utilizan todos los subproyectos, dada la escala y la complejidad del proyecto.
En esta situación, ¿intentaría generar una representación visual del DAG para cada una de las dependencias del componente afectado e intentaría determinar dónde pueden ocurrir colisiones en tiempo de ejecución? No tengo control sobre cómo se gestionan las dependencias en otros subproyectos, y no puedo cambiar ningún código Java que haya sido escrito por otros desarrolladores
Las soluciones que se me ocurrieron solo funcionan durante una hora o dos, y luego dejan de funcionar debido a los cambios en los componentes ascendentes. Un ejemplo de un componente ascendente es un artefacto en el que el proyecto en el que estoy trabajando depende del que se construye en una etapa anterior en la tubería de CI.
A petición de otros , voy a incluir información sobre qué tecnología se está utilizando, a riesgo de que se cierre la pregunta por proporcionar demasiada información o que el cuerpo se alargue demasiado:
- Maven se usa para la gestión de dependencias; y
- Spring se utiliza como contenedor DI;
- La mayoría de los problemas de dependencia implican contextos de bean superpuestos como resultado de los contextos de otros módulos que se cargan en tiempo de ejecución
- El producto funciona correctamente, y hay una mezcla heterogénea de pruebas unitarias y pruebas de integración para eludir la corrección funcional del programa.
En general, estoy buscando un enfoque independiente del lenguaje para identificar formas de resolver conflictos de dependencia sin enumerar todas las combinaciones posibles de las dependencias de un proyecto determinado.
No puedo rediseñar el proyecto, agregar puertas de calidad adicionales, impulsar cambios de paradigma en toda la empresa o cambiar idiomas como una resolución.