2009-04-14 6 views
2

Nous avons un tas de scripts Ant, un pour chacun de nos sous-projets. En fin de compte, nous voulons exécuter tous ces éléments à partir d'un script de build principal et effectuer un autre nettoyage pour l'ensemble du projet. Chaque script Ant est nommé ant.xml et se trouve dans le sous-répertoire de son projet. Chacun utilise un Ant import pour importer un ant-commons.xml, puis remplace certaines de ses cibles spécifiques.Pourquoi mon fichier de construction Ant Master ne fonctionne-t-il pas correctement?

Par exemple, l'un des projets Substitue la cible compile, pour définir la classpath appropriée, et de fixer le source et target à 1,5 (les fourmis communes utilise 1.4)

Maintenant, en théorie, tout cela semble facile. Voici le script de compilation maître:

<project name="Retain" basedir="." default="main"> 
    <target name="main"> 
    <ant dir="SharedJava" antfile="ant.xml" target="clean"/> 
    <ant dir="SharedJava" antfile="ant.xml" target="copy_current"/> 
    <ant dir="GWEasySoap" antfile="ant.xml" target="clean"/> 
    <ant dir="GWEasySoap" antfile="ant.xml" target="copy_current"/> 
    <ant dir="RetainLib" antfile="ant.xml" target="clean"/> 
    <ant dir="RetainLib" antfile="ant.xml" inheritAll="false" target="copy_current"/> 
    <ant dir="RetainIndex" antfile="ant.xml" target="clean"/> 
    <ant dir="RetainIndex" antfile="ant.xml" target="copy_current"/> 
    <ant dir="RetainPersist" antfile="ant.xml" target="clean"/> 
    <ant dir="RetainPersist" antfile="ant.xml" target="copy_current"/> 
    </target> 
</project> 

Qu'est-ce qui se passe réellement:

Les premiers sous-projets fonctionnent très bien. RetainLib, qui, en fait, doit avoir une référence à la jarre SharedJava, puis échoue, pleurnicher sur comment il ne peut pas le trouver. Lorsque j'ai supprimé RetainLib, RetainIndex a échoué, se plaindre de la façon dont vous ne devez pas utiliser les génériques dans un fichier cible 1.4.

Après avoir joué ces étaient autour je résolus tout simplement insistant sur le fait sur l'exécution de la cible de compilation à l'intérieur ant-commons au lieu de l'redéfinie.

Pourquoi? Comment puis-je contourner cela? (Élégamment je veux dire - évidemment, je pourrais supprimer complètement l'utilisation de ant-communes et je parie que les choses fonctionneraient.)

Répondre

1

Je suggère d'utiliser l'attribut inheritAll = "false" sur les tâches. Le problème que vous voyez est lié au fait que le basedir et d'autres propriétés du fichier principal causent des problèmes avec les chemins relatifs des sous-projets.

Je voudrais également perdre l'attribut dir = ".." pour assurer que les bases de sous-projet gagnent.

donc ce que je ferais ...

<project name="Retain" basedir="." default="main"> 
    <target name="main"> 
    <ant antfile="SharedJava/ant.xml" target="clean" inheritAll="false"/> 
    <ant antfile="SharedJava/ant.xml" target="copy_current" inheritAll="false"/> 
    <ant antfile="GWEasySoap/ant.xml" target="clean" inheritAll="false"/> 
    <ant antfile="GWEasySoap/ant.xml" target="copy_current" inheritAll="false"/> 
    ... 
    </target> 
</project> 
+0

Non. Pardon. Votre conseil est exactement faux, au moins à partir du résultat. 1. Avec dir supprimé et inheritFalse, la construction échoue immédiatement car le script ant.xml appelé est maintenant confus quant à son répertoire. 2.Avec dir restauré à sa place glorieuse et légitime :) et inheritFalse, la construction échoue, exactement comme décrit. –

0

Tous les appels ouvre une nouvelle instance de fourmi. Même si "SharedJava" fait des remplacements dans ant-commons.xml, les autres scripts ne le voient pas. Vous pouvez essayer d'inclure ant-commons.xml dans le script de base et utiliser les valeurs dans les sous-classes, car certaines sont héritées. Pour les valeurs non héritables, comme les chemins que vous pouvez utiliser quelque chose comme des paramètres nommés:

<ant antfile="${check.build.file}" target="validateXml"> 
    <property name="p.check_dir" location="${project.base.dir}" /> 
    <property name="p.dtd_dir" location="${build.data.dir}" /> 
</ant> 

je choisir d'avoir aucune dépendance dans les tâches de scripts externes, mais ceux exprimés en tant que paramètres à leurs appels.

1

Je travaille sur un projet similaire et ce qui a été fait était de créer un répertoire build où la sortie de toutes les tâches de fourmi a été placée, il a bien fonctionné. Sans informations supplémentaires sur ce qui se passe à l'intérieur des fichiers de construction, il sera difficile de fournir des informations supplémentaires

Questions connexes