2009-12-31 15 views
1

Je reformule cette question pour la rendre un peu plus directe et facile à comprendre, j'espère.CPD/PMD entre les projets?

J'ai environ 30 composants (internes) qui vont dans une seule application Web. Cela signifie 30 projets différents avec leur propre POM séparé. J'utilise beaucoup l'héritage dans mes POMs, donc une des choses qu'ils héritent est une configuration PMD/CPD pour empêcher la duplication de code.

Même si CPD/PMD est en cours d'exécution, il ne détecte que du code en double dans le même projet. Je voudrais qu'il détecte dans l'un de mes projets s'il y a du code partagé entre les projets qui peuvent être refactorisés. De plus, je cherchais quelque chose qui pourrait (en utilisant le même concept/motif) vérifier qu'aucun code n'est partagé entre d'autres dépendances open source.

Ce serait CPD/PMD, sauf qu'il fonctionnerait sur les jars sources. Cette tâche consomme une grande quantité de mémoire si vous analysez tous les projets et leurs dépendances pour la duplication. En ce moment, je voudrais juste appliquer cela aux projets internes. Si cela fonctionne, il serait relativement facile de le faire évoluer.

Walter

+0

pouvez-vous clarifier la question? – TofuBeer

+0

Vous voulez un détecteur de code en double. Sûrement PMD est votre bête et vous avez terminé. Il semble que vous souhaitiez désosser un fichier WAR pour comparer son code source (comment vous allez traduire le bytecode pour ressembler à la source d'origine - cela semble inutile, irréalisable et tout simplement inutile) avec un autre code source, ou simplement comparer code d'octet avec votre bytecode. Pourquoi ne pas simplement comparer le code source que vous avez? – martinr

+0

De plus, il peut y avoir des problèmes juridiques avec la tentative de reverse engineering du code dans certains cas. – martinr

Répondre

2

Je ne suis pas sûr que je suis tout, mais ...

Je crée un module d'agrégation avec tous les projets que les dépendances, utilisez le maven-dependency-plugin et il est unpack-dependencies Mojo pour obtenir toutes les dépendances Sources de pot (le mojo peut prenez un classificateur comme paramètre) et décompressez-les (peut-être en target/generated-sources/java, le maven build helper plugin peut aider ici) et enfin exécuter pmd:cpd sur toute la base source.

Cela peut avoir besoin de quelques ajustements, je n'ai pas testé du tout.

+0

Pascal, merci pour vos commentaires. Je vais essayer à l'avenir. Cela semble être ma meilleure option à ce stade. Si cela fonctionne, je devrais peut-être contribuer à nouveau au plugin pmd: cpd. Je sais que la plupart des organisations ne divisent pas des projets comme celui-ci, mais tout code en double est du temps perdu à réinventer la roue qui mène à plus de bugs et à un trajet cahoteux. –

+1

Votre cas d'utilisation est parfaitement valable à mon humble avis. Exécuter un analyseur de similarité sur du code réparti sur plusieurs modules est vraiment logique. –

1

On dirait que vous voulez trouver le code dupliqué partout dans vos 30 projets. Je ne peux pas parler pour PMD; Je suppose que vous lui dites de faire un projet géant contenant tous les fichiers sources de l'union des projets. Mais oui, cela prendrait beaucoup de RAM et de CPU.

Un autre outil qui fait est le Java CloneDR. Le CloneDR trouve un code en double, qu'il soit exactement le même ou qu'il se ferme (par exemple, quelques modifications), indépendamment de la disposition du code source ou des commentaires intermédiaires. Il est assez facile de le configurer pour traiter tous les fichiers de votre ensemble de projets.

+0

Oui, Ira, c'est correct.J'ai 30 projets que je divise pour mieux comprendre comment les projets sont liés et isoler un peu les préoccupations. C'est une douleur dans la mais à quelle fréquence je dois mettre à jour les poms, mais le projet est beaucoup plus modulaire. Les sous-projets sont beaucoup plus ciblés et ont un objectif clair. –

0

Exécutez simplement PMD: CPD en tant que programme autonome. Tout ce dont il a besoin est un répertoire, et il se recurcira. Au moins, ça l'a fait pour moi. J'ai déplacé toute ma source dans un répertoire et j'ai exécuté le gui CPD à partir du fichier batch distribué avec PMD-4.2.5.

0

Vous pouvez peut-être jeter un oeil à sonar:

moteur Sonar-CPD qui est beaucoup plus évolutive et peut détecter les duplications croisées des projets.