web-dev-qa-db-fra.com

Un cycle a été détecté dans le chemin de génération du projet xxx - Problème de chemin de construction

Je suis en train de convertir mes projets en ensembles OSGI à l'aide de maven et d'Eclipse. Maven construit les choses très bien, seulement je reçois maintenant l'erreur ci-dessus dans Eclipse. Comment puis-je savoir quel projet en est la cause? Y at-il une vue spéciale ou quelque chose? Comment cela peut-il arriver, je suppose que maven peut également détecter les dépendances cycliques?

Mettre à jour

Ok, j'ai trouvé quelque chose ici Et ici

Cela pourrait-il être causé par le plugin felix maven-bundle-plugin qui effectue également pour chaque exportation une importation?

40
Mauli

Marquez les dépendances circulaires comme "Avertissement" dans l'outil Eclipse pour éviter l'erreur "UN CYCLE A ÉTÉ DÉTECTÉ DANS LE CHEMIN DE CONSTRUCTION".

Dans Eclipse, allez à:

Windows -> Préférences -> Java-> Compilateur -> Construction -> Dépendances circulaires

77
user2582855

Lorsque nous avons plusieurs projets dans l'espace de travail, nous devons définir les références entre les projets, pas entre les projets. Si P1 fait référence à P2, P2 fait référence à P3 et P3 renvoie à P1. Cela provoquera un cycle. 

La solution consiste à dessiner un diagramme de la référence entre les projets dans l’espace de travail. Vérifiez le chemin de construction Java de chacun des projets pour voir l'onglet de la fenêtre Projets. Sortez le projet qui renvoie au projet principal, par exemple. P3 fait référence à P1, dans cet exemple ci-dessus.

L’opération détaillée consiste à sélectionner un projet P3 dans RAD OR Eclipse, à cliquer avec le bouton droit de la souris sur le projet et à choisir l’option Propriétés, une nouvelle fenêtre s’affiche pour les propriétés de P3. Cliquez sur la section "Chemin de construction Java", choisissez l'onglet "Projets". Vous pouvez voir que le P3 a référencé P1 dans le champ. Sélectionnez la référence P1, cliquez sur le bouton "Supprimer" situé à droite de la fenêtre. Ensuite, cliquez sur OK. Le IDE commencera à réinitialiser automatiquement le chemin.

Terminé.

Conservez toutes les références mal référencées dans chaque projet jusqu'à ce que vous ayez les bonnes références pour chacun des projets de votre diagramme. Bonne chance!

10
Jack

J'ai eu cela en raison d'un projet référençant un autre.

  1. Supprimer la référence du projet A au projet B
  2. Essayez de courir, ça va casser
  3. Re-ajouter une référence
  4. Nettoyer/Nettoyer et construire
  5. Retour aux affaires
7
garrett.patterson

En termes simples, un cycle correspond au moment où le paquet A dépend du paquet B, qui dépend du paquet A. S'il s'agit du code source, il est alors impossible de construire les paquets séparément en une seule passe.

Étant donné que le problème n'apparaît que dans Eclipse, il peut s'agir d'une dépendance circulaire binaire par opposition à une dépendance circulaire du code source.

Les cycles binaires sont pris en charge dans les versions récentes d’Eclipse: Eclipsesource Blog

Si le cycle est dans votre code, je suggère de refactoriser le code en séparant une partie du code en un troisième lot afin de supprimer la dépendance circulaire.

Et faites attention si vous utilisez des fragments OSGi (un schéma courant pour les tests unitaires), car il est très facile d’introduire des cycles.

L'éditeur de manifeste d'Eclipse a une fonctionnalité dans l'onglet "Dépendances" permettant de rechercher des cycles (vous devez cliquer sur "Analyse des dépendances"), mais je ne l'ai jamais vu afficher un cycle, même si Eclipse a un grand X rouge indiquant cycle!

4
SteveD

Problème

J'ai un ancien projet qui teste deux implémentations différentes d'une interface de dictionnaire. L'un est un ArrayList non trié et l'autre est un HashTable. Les deux mises en œuvre sont chronométrées, de sorte qu'une comparaison peut être faite. Vous pouvez choisir quelle structure de données à partir des arguments de la ligne de commande. Maintenant .. J'ai une autre structure de données qui est une structure arborescente. Je veux tester l'heure, afin de le comparer à la HashTable. Donc .. Dans le nouveau projet dataStructure, je dois implémenter l'interface Dictionary. Dans le projet Dictionnaire, je dois pouvoir ajouter du code spécifique à mon nouveau projet dataStructure. Il y a une dépendance circulaire. Cela signifie que lorsque Eclipse cherche à savoir quels projets dépendent du projet A, il trouve le projet B. Lorsqu'il doit rechercher les sous-dépendances des projets dépendants, il trouve A, qui est à nouveau dépendant de B. Il n'y a pas d'arbre, mais plutôt un graphique avec un cycle.

Solution

Lorsque vous allez configurer votre chemin de construction, au lieu d'entrer dans les projets dépendants (onglet 'projets'), allez dans l'onglet Bibliothèques. Cliquez sur le bouton "Ajouter un dossier de classe ..." (en supposant que vos projets référencés se trouvent dans votre espace de travail), puis sélectionnez le dossier de la classe. Le mien est\cible. Sélectionnez ceci comme dossier de bibliothèque. Faites ceci dans le projet A, pour référencer le projet B. Faites cela dans le projet B pour référencer le projet A. Assurez-vous que vous ne faites pas référence à\target\projectNameFolder ou vous n'aurez pas d'importation correspondante. Vous n'aurez plus besoin de supprimer une dépendance, puis de la réinitialiser pour forcer la reconstruction. 

Utilisez des bibliothèques de classes au lieu de références de projets.

3
Ryan Zoerner

Parfois marquant comme avertissement 

Windows -> Préférences -> Java-> Compilateur -> Construction -> Dépendances circulaires

ne résolvez pas le problème car Eclipse ne compile pas les projets contenant un autre projet dans les dipendies qui ne sont pas compilés.

Donc, pour résoudre ce problème, vous pouvez forcer elcipse à compiler toutes les classes qu’il pourra.

Pour rendre cela juste:

  1. Désélectionner

    Windows -> Préférences -> Java-> Compilateur -> Construction -> Abandonner la construction en cas d'erreur du chemin de construction

  2. Nettoyer et reconstruire tout le projet

    Projet -> Nettoyer ...

  3. Sélectionner de nouveau:

    Windows -> Préférences -> Java-> Compilateur -> Construction -> Abandonner la construction en cas d'erreur du chemin de construction

Si vous avez sélectionné la construction automatique, vous n’avez pas besoin de le faire chaque fois que vous modifiez le code.

2
Sambuccid

J'ai rencontré un problème similaire il y a quelque temps et j'ai décidé d'écrire un plug-in Eclipse qui montre l'arborescence complète des dépendances du chemin de génération d'un projet Java (bien que ce ne soit pas en mode graphique - le résultat est écrit dans un fichier). Les sources du plug-in sont ici http://github.com/PetrGlad/dependency-tree

1
Petr Gladkikh

Outre la forme de gestion des dépendances Require-Bundle (très similaire aux dépendances pom de Maven), il est également possible d'avoir des dépendances Import-Package. Il est beaucoup plus facile d'introduire des dépendances circulaires avec Import-Package que Require-Bundle, mais YMMV.

De plus, les projets Eclipse ont une "référence de projet" qui indique les autres projets qui en dépendent. Eclipse utilise cela à un niveau élevé pour décider des projets à construire et dans quel ordre. Il est donc tout à fait possible que votre Manifest.MF répertorie tout correctement, mais que les références du projet sont fausses. Faites un clic droit sur un projet, puis allez dans les propriétés - vous verrez quels projets dépendent de vous. Si vous êtes du genre texte, ouvrez les fichiers .project et déterminez ceux qui dépendent de vous. Il est probable qu'un lien cyclique de projet soit défini à ce niveau (ce qui est souvent causé par une dépendance AB, puis retourné de BA mais sans mettre à jour les références .project).

1
AlBlue

Maven will échouera à la construction si elle détecte un cycle, car les dépendances doivent être un arbre. 

Vous pouvez constater que vous avez des déclarations supplémentaires dans le fichier manifest.mf par rapport à celles définies dans le fichier pom.xml. toute déclaration supplémentaire pourrait introduire un cycle qui ne serait pas évident pour Maven. 

1
Rich Seller

Essayez de supprimer les références et de les rajouter. Parfois, Eclipse se comporte de manière étrange, car jusqu’à ce que et sauf si vous corrigez cette erreur, il ne vous autorise pas l’actualisation. alors essayez de supprimer tous les projets de dépendance et de le rajouter Nettoyer et construire 

0
sjchoudary

Le simple redémarrage d'Eclipse a corrigé le problème dans mon projet.

0
user3235783

Cela peut se produire lorsque plusieurs projets s’incluent mutuellement sous la forme JAR ..__Je l’ai fait: toutes les bibliothèques et les dépendances de projet sur le chemin de construction ont été supprimées, pour tous les projets. Puis, un à la fois, j’ai ajouté les dépendances du projet dans l’onglet Projet, mais uniquement celles qui sont nécessaires .Cela vous permet d’ajouter un projet référencé ou un autre projet référençant un autre projet avec cette question d'auto-référence.

Cela a résolu mon problème.

0
Camilo

J'ai aussi ce problème.Je viens de désactiver la résolution de Workspace, et tout allait bien. entrer la description de l'image ici

0
Rain

J'ai rencontré le même problème aujourd'hui. L'erreur était apt. Par erreur, j'ai ajouté une dépendance cyclique. A dépendait de B. Dans mon cas, par erreur, mis à part l'ajout de B comme dépendant de A. J'ai ajouté A comme dépendant de B C'était une erreur stupide.

0
MansoorShaikh

Quand j'ai eu ces problèmes, cela a toujours été un vrai cycle dans les dépendances exprimées dans Manifest.mf

Alors ouvrez le manifeste du projet en question, sur l'onglet Dépendances, regardez l'entrée "Required Plugins". Suivez ensuite de là vers le (s) projet (s) suivant (s), et répétez éventuellement le cycle.

Vous pouvez simplifier quelque peu cette tâche en utilisant les liens Analyse des dépendances situés dans le coin inférieur droit de l'onglet Dépendances. Vous y trouverez la détection de cycle et des dépendances de navigation plus faciles.

Je ne sais pas non plus pourquoi Maven est plus tolérant,

0
djna

Bien que "Mark Circular Dependencies" vous permette de compiler le code, cela peut entraîner un environnement plus lent et des problèmes futurs.

Cela se produit car à un moment donné, Eclipse a perdu ses instructions sur votre chemin de génération.

1 - Supprimez le projet et ses références de l’espace de travail . 2 - Réimportez-le .. 3 - Vérifiez les références.

C'est la meilleure solution.

0
Machado