2010-06-10 3 views
16

J'ai une application web Maven avec des fichiers texte dansMaven chaîne Remplacer du texte Ressources Web

src/main/webapp/textfilesdir

Si je comprends bien, au cours de la phase package ce textfilesdir répertoire sera copié dans le

cible/projet-1.0-SNAPSHOT

répertoire, qui est ensuite compressé en un

cible/projet 1.0 SNAPSHOT.war

Problème

Maintenant, je dois faire un remplacement de chaîne sur la contenu des fichiers texte dans target/project-1.0-SNAPSHOT/textfilesdir. Cela doit ensuite être fait après la copie de textfilesdir dans target/project-1.0-SNAPSHOT, mais avant la création du fichier target/project-1.0-SNAPSHOT.war. Je crois que tout cela est fait pendant la phase d'emballage.

Comment un plugin (potentiellement maven-antrun-plugin) peut-il se brancher dans la phase du paquet pour cela?

Les fichiers texte ne contiennent pas de propriétés, telles que $ {nom-propriété} à filtrer. Le remplacement de chaîne est probablement la seule option.

options

  1. Modifier les fichiers texte après la copie dans le répertoire cible/projet-1.0-SNAPSHOT, mais avant la création de WAR. Après l'empaquetage, extrayez les fichiers texte de WAR, modifiez-les et ajoutez-les à nouveau dans le fichier WAR.

Je pense qu'il y a une autre option ici qui me manque. Pensées quelqu'un?

Répondre

4

L'option 1 n'est pas faisable, prepare-package est trop tôt, package est trop tard donc je ne vois pas où vous pourriez brancher un travail personnalisé. L'option 2 est faisable mais un OMI douloureux. Voici donc d'autres propositions (toutes basées sur AntRun et les tâches ReplaceRegExp et/ou Replace).

Solution 1:

  1. Créer un nouveau dossier dans lequel vous mettez les fichiers texte qui doivent être traitées. Liez le plugin antrun à prepare-package et configurez-le pour traiter les fichiers et placer les fichiers traités dans un répertoire sous target (par exemple target/textfilesdir).
  2. Configurez le plug-in de guerre pour inclure target/textfilesdir en tant que webResource. Reportez-vous au Adding and Filtering External Web Resources pour les détails.

Solution 2:

  1. Bind le plugin antrun pour prepare-package et le configurer pour traiter les fichiers texte à partir src/main/webapp/textfilesdir et mettre les fichiers traités dans le target/project-1.0-SNAPSHOT.
  2. Configurez le plug-in war pour exclure les fichiers précédemment traités. Encore une fois, référez-vous au Adding and Filtering External Web Resources pour les détails.

Je pense que j'irais pour la deuxième solution.

+0

comme d'habitude, je suggère d'utiliser gmaven (http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code) pour intégrer groovy plutôt que de fourmi, mais sinon je suis entièrement d'accord (+1) –

+0

@seanizer: Je dois penser plus Groovy :) Il jouerait certainement bien ici. –

+0

yup. alors que je ne suis pas trop fou de construire des applications groovy (grails etc), je pense que groovy est absolument sous-estimé comme un langage de script –

1

Vous pouvez utiliser maven-plugin-succédané:

<plugin> 
     <groupId>com.google.code.maven-replacer-plugin</groupId> 
     <artifactId>maven-replacer-plugin</artifactId> 
     <version>1.3.7</version> 
     <executions> 
      <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>replace</goal> 
       </goals>     
      </execution> 
     </executions> 
     <configuration> 
      <file>target/${project.artifactId}-${project.version}/WEB-IN/site.xml</file> 
      <replacements> 
       <replacement> 
        <token>ear.version</token> 
        <value>${ear.version}-${maven.build.timestamp}</value> 
       </replacement>   
      </replacements> 
     </configuration> 
    </plugin> 

Mais vous avez besoin de deux autres tours. L'un est l'explosion ajoutant objectif au plugin de guerre:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
     ..... 
     <executions> 
     <execution> 
     <phase>prepare-package</phase> 
      <goals> 
       <goal>exploded</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Et enfin besoin d'appeler mvn propre avant que le paquet. Vous pouvez le faire à partir de votre pom:

    <plugin> 
        <artifactId>maven-clean-plugin</artifactId> 
        <version>2.4.1</version> 
        <executions> 
         <execution> 
         <id>auto-clean</id> 
         <phase>initialize</phase> 
         <goals> 
          <goal>clean</goal> 
         </goals> 
         </execution> 
        </executions> 
      </plugin> 

Si vous utilisez une version du plugin-maven-guerre plus récente que 2.0.1, vous devrez inclure vrai dans la configuration du-plugin maven-guerre , sinon les changements apportés à vos fichiers seront divisés lorsque le plugin de guerre copie votre webapp une seconde fois. Si vous utilisez Hudson/Jenkins, vous devrez utiliser une version plus récente que 2.0.1.

7

J'ai eu le même problème et j'ai beaucoup tripoté avec ce problème, alors je vais répondre, même si cette question est assez ancienne. Comme indiqué par leandro et Phil, on peut utiliser le maven-replacer-plugin. Mais leur solution n'a pas fonctionné pour moi. L'activation de useCache a provoqué une erreur qui a rendu impossible la construction du projet. De plus, je ne peux pas faire fonctionner l'auto-nettoyage correctement. Comme je ne suis pas encore permis de commenter le post, je fournirai ma solution complète ici:

Tout d'abord, configurez le maven-succédané-plugin:

<plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>maven-replacer-plugin</artifactId> 
    <version>1.3.7</version> 
    <executions> 
    <execution> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>replace</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <includes> 
     <include>target/${project.build.finalName}/static/**/*.css</include> 
    </includes> 
    <regex>false</regex> 
    <token>someString</token> 
    <value>replaceString</value> 
    </configuration> 
</plugin> 

Avant la guerre réelle est construit , nous créons une guerre éclatée. Cela signifie que tout le contenu du fichier war est stocké dans un sous-répertoire (qui est target/$ {project.build.finalName} par défaut). Après cela, le maven-replacer-plugin va changer le contenu des fichiers comme nous l'avons spécifié. Enfin, le .war sera emballé dans la phase de paquetage par le travail default-war. Pour éviter que le contenu du dossier de guerre éclaté ne soit ignoré, vous devez définir warSourceDirectory dans le répertoire où est stocké le fichier de guerre éclaté.L'extrait de configuration suivante fera ce travail:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <executions> 
    <execution> 
     <id>prepare</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>exploded</goal> 
    </goals> 
    </execution> 
    <execution> 
     <id>default-war</id> 
     <phase>package</phase> 
     <goals> 
     <goal>war</goal> 
     </goals> 
     <configuration> 
     <warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Le paquet avec le contenu remplacé peut être construit en utilisant mvn clean package

+0

Fantastique, merci. – user467257

3

J'ai eu un problème avec les phases, en utilisant prepare-package ne copier le fichier à la guerre , ma solution était la suivante:

Ajouter cette configuration en plugin maven-guerre

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
     <executions> 
      <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>exploded</goal> 
       </goals> 
      </execution> 
      <executions> 
       <configuration> 
       <webResources> 
        <resource> 
         <directory>${basedir}/WebContent?</directory> <excludes> 
       <!--Exclude the file because it is copied using the maven replacer plugin --> 
         <exclude>/style.scss</exclude> 
         </excludes> 
        </resource> 
       </webResources> 
      </configuration> 
      </plugin> 
      Add the configuration to replacer 
<plugin> 
     <groupId>com.google.code.maven-replacer-plugin</groupId> 
     <artifactId>replacer</artifactId> 
     <version>1.5.1</version> 
     <executions> 
      <execution> 
       <id>scss-replacement</id> <phase>prepare-package</phase> <goals> 
       <goal>replace</goal> 
       </goals> <configuration> 
       <file>WebContent?/css/style.scss</file> 
       <!-- My local file(WebContent?/css/style.scss) have a param 
       $url: "http://localhost:8080/interface"; 
       --> <!-- regex with match to $url: "http://localhost:8080/interface"; --> 
       <token>\$url:.</token> 
       <!-- Replace to --> 
       <value>\$url: "www.myapplication.com.br/css/style.css";</value> 
       <outputFile>target/app/css/style.scss</outputFile> 

       </configuration> 
      </execution> 
    <executions> 
<plugin> 

Le fichier de sortie ne remplace pas le fichier, donc j'ai mis la configuration maven-war-plugin pour exclure le fichier style.scss. au revoir!

2

Une autre solution de ma part, désolé d'être en retard à la fête, mais pourrait être utile pour certaines personnes. La solution ci-dessus n'a tout simplement pas fonctionné pour moi parce que j'avais des superpositions en place et donc l'utilisation du plugin de remplacement était difficile dans la source principale. Par conséquent, j'ai utilisé maven-war-plugin pour générer le répertoire temporaire pour moi dans la phase prepare-package et avoir un plugin de remplacement pour le manipuler et libérer la guerre de ce répertoire afin que rien d'autre ne le remplace.

 <plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>prepare</id> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>exploded</goal> 
     </goals> 
     <configuration> 
      <webappDirectory>${project.build.directory}/${project.build.finalName}-patched/</webappDirectory> 
     </configuration> 
     </execution> 
     <execution> 
     <id>default-war</id> 
     <phase>package</phase> 
     <goals> 
      <goal>war</goal> 
     </goals> 
     <configuration> 
      <useCache>true</useCache> 
      <warSourceDirectory>${project.build.directory}/${project.build.finalName}-patched/</warSourceDirectory> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    <executions> 
     <execution> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>replace</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <file>${project.build.directory}/${project.build.finalName}-patched/fileToBeChanged.txt</file> 
     <token>ValueToChange</token> 
     <value>ValueToReplace</value> 
    </configuration> 
    </plugin> 
Questions connexes