2010-05-14 13 views
0

Étant donné que j'ai une liste de dépendances disponibles sous forme de bits dans des fichiers externes. Ceux-ci seront regroupées dans une liste comme:Code Java pour convertir une liste de dépendances dans un ordre de construction?

module1 
module2 dependsOn module1 
module3 dependsOn module1 
module4 dependsOn module3 

Je voudrais créer un ordre de construction où chaque étape de construction se trouve sur une ligne, et chaque ligne contient une liste d'un ou plusieurs modules qui peuvent être compilés à en même temps, et qui ne dépendent que des modules compilés précédemment.

Ainsi, pour l'ensemble de données ci-dessus, créez une liste comme:

module1 
module2,module3 
module4 

Maintenant, cela est fondamentalement juste un problème de créer un graphe orienté, et de l'analyser. Maintenant, j'utilise Ant, et aimerais beaucoup utiliser quelque chose dans le commerce ... quel est le minimum de code personnalisé dont j'ai besoin pour créer une telle liste de construction à partir de l'entrée donnée? Je ne veux pas écrire tout le code moi-même (que je sais faire), mais chercher des bibliothèques pour m'aider ici ...

BTW, ces modules sont en fait des modules personnalisés, donc Maven ne fonctionnera pas. De plus, la liste des modules est créée à la volée à partir du code source Java, et je ne peux pas le coder en dur dans le fichier de construction. Dessinez un arbre de vos dépendances et observez les niveaux.

+0

est-ce que les dépendances représentées dans un ant-script avec des cibles différentes? – aioobe

+0

Qu'en est-il des commentaires sournois sur le lolz que les dépendances circulaires sont? J'adore sûrement que mes classes n'aient pas de dépendances circulaires entre elles (et DSM d'IntelliJ IDEA aide grandement ici [Graph de matrice de structure de dépendance]). Mais les dépendances circulaires entre les modules? Jamais même cauchemardé à ce sujet :) – SyntaxT3rr0r

+0

@aioobe: les dépendances sont définies dans des fichiers externes. –

Répondre

0

Vous pouvez commencer à construire à la racine et construire chaque niveau de l'arbre en parallèle étant donné que les niveaux ci-dessus sont déjà construits.

1----->2 
| 
----->3----->4 

^ ^ ^
|  |  | 
A  B  C 

construire un premier (module 1), B (2 & 3), puis C (4).

EDIT: Si vous utilisez Ant et demandez spécifiquement pour une solution de résolution des dépendances pour Ant, vous pouvez jeter un oeil à Apache Ivy

+0

Oui, c'est en effet ce que j'aime faire ... alors quel est le Solution? Ivy exigera de moi que les dépendances soient incluses dans le script de construction, mais elles ne seront disponibles qu'à partir de fichiers de métadonnées externes ... mais pas exprimées en target build.xml ou en alternatives Ivy ... –

+0

Qu'est-ce que vous avez besoin d'aide exactement? ? Vous devrez écrire un plugin ant ou utiliser un plugin de script pour intégrer votre solution de construction personnalisée à celle existante. –

+1

Selon le niveau d'intégration, vous pouvez écrire un plugin ant, un résolveur personnalisé ivy, ou quelque chose de complètement différent. Vous devez préciser votre problème plus clairement. Pour le résolveur personnalisé, voir http: //ant.apache.org/ivy/history/2.0.0-alpha2/configuration/classpath.html –

0

Ant peut gérer pour vous. Vous décrivez fondamentalement les dépendances de votre module en tant que dépendances cibles. Jetez un coup d'œil à [http://stroy.wikidot.com/motpe]. Il s'agit de 2 scripts ant avec les mêmes conventions pour gérer les builds multi-modules.

+0

Les dépendances sont répertoriées dans des fichiers externes et je ne peux pas les coder en dur dans le fichier build.xml. –

2

Vous pouvez utiliser le tri topologique pour voir comment le classement réel est effectué. Cela peut être fait en utilisant unix util tsort ou vous pouvez rechercher une implémentation pour le tri toplogique (Excalibur Framework a quelque chose comme ça).

+1

Le seul problème est que le tri topologique ne prend pas en compte les tâches parallèles, ou ai-je raté quelque chose? –

+0

Comment cela fonctionnerait-il pratiquement? Pouvez-vous pointer vers un tutoriel sur la façon d'écrire une implémentation en faisant cela? Peut-être quelque chose basé sur ce Excalibur Framework (URL?) Que vous mentionnez ... –