Dépendances circulaires dans Eclipse
Le mardi 22 juillet 2008 à 19:04 - Lien permanent
Aussi étonnant que cela puisse paraître, Eclipse signale par défaut une erreur, et ne compile rien du tout, s'il y a des dépendances circulaires entre projets : il se contente de sortir un message d'erreur du type A cycle was detected in the build path of project.... Les dépendances circulaires sont pourtant nécessaires dans bien des cas.
Pour résoudre le problème, il faut aller modifier une préférence dans Java > Compiler > Building. Là, il faut régler Circular Dependencies sur Warning au lieu de Error.
Commentaires
Ca alors !? Ce qui me surprend au contraire, c'est que ce soit autorisé !
Les dépendence circulaires sont généralement un signe de mauvais design, et il est toujours possible de les casser (en général en déplaçant les éléments introduisant les dépendences dans un nouveau projet).
D'ailleurs à ma connaissance, c'est impossible d'avoir des dépendences circulaire entre assemblies .NET, de la même façon qu'on ne peut en avoir entre DLL Windows (puisque Windows est censé charger d'abord les dépendences).
Mais d'ailleurs comment Eclipse décide-t-il de l'ordre de compilation des projets ? N'est-il pas censé compiler d'abord les projets dont un autre dépend afin d'en obtenir les metadata ?
Je suis d'accord, les dépendances circulaires ne sont certainement pas un signe de bonne programmation. Pourtant il y a des cas où c'est relativement nécessaire. Par exemple, j'ai voulu créer une sorte de plug-in pour le logiciel Logisim. Logisim constitue un projet, et je n'ai pas vraiment la possibilité de le casser, ou de regrouper d'autres choses avec lui, car il pourrait directement être lié à un repository CVS/SVN sur Sourceforge. Mon plugin va constituer un deuxième projet, qui dépend du premier. Logique. Mais ensuite, je veux me compiler une version customisée de Logisim qui charge mon plugin automatiquement, donc le premier projet va aussi dépendre du deuxième. Ce n'est peut-être pas très propre, mais ça présente le gros avantage de la simplicité...
Par metadata, tu veux dire, notamment, la liste des classes, les interfaces des classes ?
Les dépendances circulaires ont été introduites dans Eclipse 2.1. D'après ce que je comprends des bugs #10262 et #25952, Eclipse commence par calculer un ordre de compilation des projets qui casse les cycles le moins possible. Puis Eclipse itère dans des tentatives de construction des projets, dans cet ordre. Il y a bien entendu un nombre maximum d'itérations...
Wow, ca m'a l'air incroyablement compliqué ces histoire de compilation itératives...
Je veux bien reconnaître qu'il doit y avoir des cas où les dépendences circulaires peuvent être inévitables, mais par contre je ne suis pas vraiment convaincu par ton exemple. Pourquoi Logisim doit-il dépendre de ton plugin ? Tu pourrais de contenter de charger le plugin dynamiquement au lancement du programme, sans avoir à introduire de dépendence entre les deux, non ?
Oui je pourrais si j'étais moins fénéant... ;-) Dans Logisim on peut charger des fichiers JAR dynamiquement, mais il faut aller chercher le fichier à la main dans le système de fichiers. Certes, je pourrais l'automatiser dans le code, mais ça ferait un peu de boilerplate code à écrire, voire un JAR à générer à chaque lancement... Pour mes builds personnelles de Logisim, je me suis contenté de rajouter en dur une référence à mes classes, ce qui fait que je peux très facilement tester mes modifs juste en faisant « Run ». J'aurais pu m'en passer, mais c'est tellement pratique !
Après tes remarques, je me dis que l'option prise par Eclipse est finalement assez mesurée. C'est bien utile de pouvoir avoir des dépendances circulaires entre projets, donc c'est possible, mais comme ça traduit sûrement une mauvaise conception, ça génère des warnings...