2010-03-28 21 views
3

J'ai ce projet multi-module.exécution d'un script depuis maven dans un projet multi-modules

Au début de chaque construction, je voudrais exécuter un fichier bat.

Alors je l'ai fait ce qui suit:

<profile> 
      <id>deploy-db</id> 
      <build> 
       <plugins> 
<plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.1.1</version> 
     </plugin> 
       </plugins> 
       <pluginManagement> 
        <plugins> 
         <plugin> 
          <groupId>org.codehaus.mojo</groupId> 
          <artifactId>exec-maven-plugin</artifactId> 
          <version>1.1.1</version> 
          <executions> 
           <execution> 
            <phase>validate</phase> 
            <goals> 
             <goal>exec</goal> 
            </goals> 
            <inherited>false</inherited> 
           </execution> 
          </executions> 
          <configuration> 
           <executable>../database/schemas/import_databases.bat</executable> 
          </configuration> 
         </plugin> 
        </plugins> 
       </pluginManagement> 
      </build> 
     </profile> 

quand je lance la mvn verify -Pdeploy-db de la racine que je reçois ce script exécuté maintes et maintes fois dans chacun de mes modules.

Je veux qu'il ne soit exécuté qu'une seule fois, dans le module racine.

Que manque-t-il?

Merci

+1

C'est une "bonne" question. Le problème ici est que ** les effets ** du profil sont hérités et que le plugin maven exec est ainsi exécuté pour tous les enfants. Besoin de creuser ça (mais j'ai peur qu'il n'y ait pas de solution propre). –

+0

Non vraiment, j'adore Maven c'est génial dans son idée (comme le communisme :-)). Mais quand il s'agit de choses simples comme celle-là, ça échoue absolument ... Il me semble que je vais devoir écrire un plugin personnalisé pour que cela soit propre. – Roman

Répondre

1

Je peux me tromper, mais lorsque vous ajoutez un plug-in à la section <pluginManagement> chaque sous-module hérite et « runs » il.

Je pense que vous devriez vous déplacer exec-maven-plugin et son <execution> à la section normale <plugins>.

+1

Ce n'est pas tout à fait exact. PluginManagment ne configure que le plugin. Ne lui dit rien d'être appliqué. En bref, cela ne fonctionne pas ... – Roman

+0

lorsque vous ajoutez la section d'exécution - qui dit quelque chose sur son invocation ... – Yaneeve

+1

@Roman, exécutez 'mvn help: effective-pom' à partir des sous-modules pour voir ce que est hérité/ce qui est appliqué et ce qui n'est pas –

0

Donc le problème que vous rencontrez est que vous essayez de faire quelque chose dans le parent POM. Ce n'est pas ainsi que les poms parentaux sont conçus en maven (c'est-à-dire pas "la manière maven"). Vous ne devriez effectuer des actions que dans les poms "leaf node", les parents sont juste pour l'agrégation et mettre un comportement partagé qui devrait être réutilisé dans chaque enfant. La réponse à l'appel de votre script est donc d'analyser les dépendances entre vos enfants pour déterminer ce qui doit arriver en premier (et d'imposer une dépendance si nécessaire pour l'appliquer), puis d'ajouter le plugin à cet enfant. Si cela ne convient pas bien à cet enfant pour une raison quelconque, vous pouvez en faire un autre qui effectue cette action. Sur une note de côté, ne faites jamais référence aux chemins de fichiers relatifs dans maven. Vous utilisez "../database/schemas/import_databases.bat". Si import_databases.bat n'est pas dans le répertoire du projet, supposer qu'il se trouve dans le répertoire parent demande un désordre. Vous devriez plutôt utiliser quelque chose comme "$ {basedir} /src/main/scripts/import_databases.bat"