Nous avons un grand système Java (>500 000 LOC) qui dépend de 40-50 paquets OSS. . Le système est construit à l'aide de Ant, et la gestion des dépendances est est actuellement gérée manuellement. Je suis en train d'étudier Ivy et/ou Maven pour automatiser les dépendances. Nous avons étudié Maven comme système d'automatisation d'automatisation de la construction l'année dernière et l'avons rejeté parce qu'il nécessitait une restructuration totale de l'application. restructurer notre système pour l'adapter à l'architecture de Maven. Maintenant, je Je cherche maintenant à automatiser uniquement les tâches de gestion des dépendances.
J'ai fait quelques expériences avec Ivy mais j'ai rencontré des problèmes. Par exemple, lorsque je spécifie ActiveMQ comme dépendance, et que je demande à Ivy de d'utiliser les POMs dans le référentiel Maven pour la spécification des dépendances, Ivy Ivy récupère un tas de paquets (Jetty, Derby et Geronimo par exemple) qui par exemple) dont je sais qu'ils ne sont pas nécessaires pour utiliser ActiveMQ.
Si je définis usepoms="false" dans ivysettings.xml, il récupère seulement activemq.jar, mais cela semble aller à l'encontre du but d'Ivy et le et le relègue à un simple récupérateur de bocaux avec des spécifications de dépendances spécifications.
Il y a un plus gros problème ici, ce qu'on appelait "l'enfer des DLL" sous Windows. Dans certains cas, deux dépendances directes de premier niveau vont pointeront vers différentes versions de la même dépendance transitive (par exemple exemple log4j.jar). Un seul log4j.jar peut se trouver dans le classpath. la résolution des dépendances implique de déterminer manuellement quelle version est compatible avec tous ses clients dans notre système.
Je pense que tout se résume à la qualité de la spécification des dépendances de chaque paquet de chaque paquet (le POM). Dans le cas d'ActiveMQ, il n'y a pas de déclarations de portée de scope, donc toute référence à ActiveMQ téléchargera toutes ses dépendances dépendances, à moins que nous n'excluions manuellement celles que nous ne voulons pas que nous ne voulons pas.
Dans le cas de log4j, la résolution automatique des dépendances nécessiterait que tous les clients de log4j (les autres paquets qui dépendent de log4j) valident contre toutes les versions antérieures de log4j et fournissent un éventail (ou une liste) de versions compatibles de log4j dans le POM. C'est probablement trop trop demander.
Est-ce l'état actuel des choses, ou est-ce que je rate quelque chose ?