Maven String Замена текстовых веб-ресурсов - PullRequest
16 голосов
/ 11 июня 2010

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

src / main / webapp / textfilesdir

Насколько я понимаю, на этапе упаковки этот каталог textfilesdirбудет скопирован в каталог

target / project-1.0-SNAPSHOT

, который затем будет заархивирован в

target /project-1.0-SNAPSHOT.war

Задача

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

Как плагин (потенциально maven-antrun-plugin) может подключиться к фазе пакета, чтобы сделать это.

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

Параметры

  1. Изменить текстовые файлы после копирования в каталог target / project-1.0-SNAPSHOT,еще до создания WAR.

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

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

Ответы [ 5 ]

7 голосов
/ 28 сентября 2012

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

Прежде всего, настройте maven-replacer-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>

До того, как настоящая война будет построена, мы создаем взрывную войну. Это означает, что все содержимое файла war хранится в подкаталоге (по умолчанию это 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

4 голосов
/ 11 июня 2010

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

Solution 1:

  1. Создайте новую папку, в которую вы помещаете текстовые файлы, которые необходимо обработать.
  2. Привязайте плагин antrun к prepare-package и настройте его для обработки файлов и поместите обработанные файлы в какой-то каталог в target(например, target/textfilesdir).
  3. Настройте военный плагин так, чтобы он включал target/textfilesdir как webResource.Подробнее см. Добавление и фильтрация внешних веб-ресурсов .

Решение 2:

  1. Свяжите плагин antrun с prepare-package и настройте егодля обработки текстовых файлов из src/main/webapp/textfilesdir и помещения обработанных файлов в target/project-1.0-SNAPSHOT.
  2. Настройте плагин war для исключения ранее обработанных файлов.Опять же, обратитесь к Добавление и фильтрация внешних веб-ресурсов для получения подробной информации.

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

3 голосов
/ 08 ноября 2012

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

Добавить эту конфигурацию в maven-war-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> 
               <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 голосов
/ 13 октября 2016

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

      <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>
1 голос
/ 04 апреля 2011

Вы можете использовать maven-replacer-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>
           <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>

И, наконец, перед вызовом нужно вызвать mvn clean. Вы можете сделать это из вашей помпы:

                   <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-war-plugin, более новую, чем 2.0.1, вам нужно будет включить true в конфигурацию maven-war-plugin, иначе изменения в ваших файлах будут Это происходит, когда плагин войны копирует ваше веб-приложение во второй раз. Если вы используете Hudson / Jenkins, вам придется использовать версию более новую, чем 2.0.1.

...