2010-06-10 4 views
16

у меня есть веб-приложение Maven с текстовыми файлами вMaven строка Заменить из текста веб-ресурсов

SRC/главная/WebApp/textfilesdir

Как я понимаю, во время фазы упаковки это textfilesdir каталог будет скопирован в

мишени/проект-1.0-SNAPSHOT

каталог, который затем застегнул в

мишень/проект-1,0-SNAPSHOT.war

Проблема

Теперь мне нужно сделать замену струны на содержимое текстовых файлов в файле target/project-1.0-SNAPSHOT/textfilesdir. Затем это необходимо сделать после того, как textfilesdir будет скопирован в target/project-1.0-SNAPSHOT, но до создания файла target/project-1.0-SNAPSHOT.war. Я считаю, что это все сделано во время фазы пакета.

Как можно подключить плагин (возможно, maven-antrun-plugin), подключить его к фазе упаковки.

Текстовые файлы не содержат свойств, таких как $ {property-name} для фильтрации. Возможно, заменой строки является единственный вариант.

Опции

  1. Изменить текстовые файлы после копирования в папку целевой/проекта-1,0-съёмка, еще до создания WAR.

  2. После упаковки извлеките текстовые файлы из WAR, измените их и добавьте обратно в WAR.

Я думаю, что здесь есть другой вариант. Мысли кто-нибудь?

ответ

4

Вариант 1 не является выполнимым, prepare-package еще слишком рано, package слишком поздно, поэтому я не вижу, где вы могли бы подключить какую-либо специальную работу. Вариант 2 выполним, но болезненная ИМО. Итак, вот еще несколько предложений (все на основе AntRun и задач ReplaceRegExp и/или Replace).

Решение 1:

  1. Создать новую папку, в которой вы положили текстовые файлы, которые должны быть обработаны.
  2. Привяжите плагин antrun к prepare-package и настройте его для обработки файлов и поместите обработанные файлы в какой-либо каталог под target (например, target/textfilesdir).
  3. Настройте военный плагин, чтобы включить target/textfilesdir в качестве webResource. Обратитесь к Adding and Filtering External Web Resources за подробностями.

Решение 2:

  1. Свяжите antrun плагин prepare-package и настроить его для обработки текстовых файлов с src/main/webapp/textfilesdir и поместить обработанные файлы в target/project-1.0-SNAPSHOT.
  2. Настройте военный плагин, чтобы исключить ранее обработанные файлы. Снова обратитесь к Adding and Filtering External Web Resources за подробностями.

Я думаю, что я пошлю второе решение.

+0

, как обычно, я предлагаю использовать gmaven (http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code) встраивать заводной, а не муравей, но в остальном я полностью согласен (+1) –

+0

@seanizer: Мне нужно думать больше Groovy :) Это, безусловно, сыграет здесь. –

+0

yup. в то время как я не слишком сумасшедший в создании отличных приложений (grails и т. д.), я думаю, что groovy абсолютно недооценен как язык сценариев –

1

Вы можете использовать Maven-заменитель-плагин:

<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> 

Но вам нужно больше двух трюков. Одним из них является добавление взрываются цель войны плагин:

<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> 

И, наконец, необходимо вызвать МВН чист перед пакетом. Вы можете сделать это с вашего П:

    <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> 

Если вы используете версию Maven войны-плагин новее, чем 2.0.1, вам нужно будет включить верно в конфигурации Maven-войне-плагин , в противном случае изменения в ваших файлах будут разбиты, когда военный плагин копирует ваш webapp во второй раз. Если вы используете Hudson/Jenkins, вам придется использовать версию более позднюю, чем 2.0.1.

7

У меня была такая же проблема, и я много разбирался в этой проблеме, поэтому я отвечу, хотя этот вопрос довольно старый. Как заявил leandro и Phil, можно использовать плагин maven-replacer. Но их решение не сработало для меня. Включение useCache вызвало ошибку, из-за которой невозможно было построить проект. Кроме того, я не могу заставить машину автоматически работать. Поскольку я еще не разрешено комментировать этот пост, я представлю свое полное решение здесь:

Прежде всего, настроить Maven-заменитель-плагин:

<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> 

До фактической войны построен , мы создаем взорванную войну. Это означает, что все содержимое файла войны хранится в подкаталоге (который является target/$ {project.build.finalName} по умолчанию). После этого maven-replacer-plugin изменит содержимое файлов, как мы указали. Наконец, .war будет упакован в фазе упаковки с помощью задания default-war. Чтобы избежать переопределения содержимого вложенной военной папки, нужно установить warSourceDirectory в каталог, в котором хранится взорванная боевая вещь.Следующий фрагмент кода конфигурации будет выполнять эту работу:

<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> 

пакет с замененным контента может быть построен с использованием mvn clean package

+0

Фантастично, спасибо. – user467257

3

У меня была проблема с фазами, используя подготовки-пакет не копируется файл на войне , мое решение было это:

Добавить эту конфигурацию в Maven-войны-плагин

<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> 

Выходной файл не перезаписывает файл, поэтому я включил конфигурацию maven-war-plugin, чтобы исключить файл style.scss. пока!

2

Еще одно решение от меня, жаль, что опоздал на вечеринку, но все же может быть полезен для некоторых людей. Решение выше просто не работало для меня, потому что у меня были наложения, и поэтому использование плагина-заменителя было трудным в основном источнике. Следовательно, я использовал maven-war-plugin для создания временного каталога для меня на этапе подготовки пакета и с плагином-заменителем, чтобы манипулировать им и освободить войну из этого каталога, чтобы ничто другое не перекрывало его.

 <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> 
Смежные вопросы