Maven String Замена текстовых веб-ресурсов
У меня есть веб-приложение Maven с текстовыми файлами в
SRC/Основной/WebApp/textfilesdir
Как я понимаю, во время фазы пакета этот каталог textfilesdir будет скопирован в
target/project-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} для фильтрации. Возможно, заменой строки является единственный вариант.
Опции
-
Измените текстовые файлы после копирования в каталог target/project-1.0-SNAPSHOT, но до создания WAR.
-
После упаковки извлеките текстовые файлы из WAR, измените их и добавьте в WAR.
Я думаю, что здесь есть еще один вариант. Мысли кого-нибудь?
Ответы
Ответ 1
Вариант 1 не выполним, prepare-package
слишком рано, package
слишком поздно, поэтому я не вижу, где вы могли бы подключить какую-либо специальную работу. Вариант 2 выполним, но болезненная ИМО. Итак, вот еще несколько предложений (все на основе AntRun и ReplaceRegExp и/или Replace).
Решение 1:
- Создайте новую папку, в которую вы помещаете текстовые файлы, которые необходимо обработать.
- Привяжите плагин antrun к
prepare-package
и настройте его для обработки файлов и поместите обработанные файлы в какой-либо каталог под target
(например, target/textfilesdir
).
- Настройте военный плагин, чтобы включить
target/textfilesdir
в качестве webResource
. Подробнее см. Добавление и фильтрация внешних веб-ресурсов.
Решение 2:
- Привяжите плагин antrun к
prepare-package
и настройте его для обработки текстовых файлов из src/main/webapp/textfilesdir
и поместите обработанные файлы в target/project-1.0-SNAPSHOT
.
- Настройте военный плагин, чтобы исключить ранее обработанные файлы. Снова обратитесь к Добавление и фильтрация внешних веб-ресурсов для получения подробной информации.
Думаю, я поеду за вторым решением.
Ответ 2
У меня была такая же проблема, и я много разбирался в этой проблеме, поэтому я отвечу, хотя этот вопрос довольно старый. Как заявил leandro и Phil, можно использовать плагин maven-replacer. Но их решение не сработало для меня. Включение useCache
вызвало ошибку, из-за которой невозможно было построить проект. Кроме того, я не могу заставить машину автоматически работать.
Поскольку мне еще не разрешено прокомментировать эту должность, я предоставлю здесь свое полное решение:
Прежде всего, настройте плагин maven-replacer:
<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
Ответ 3
У меня возникла проблема с фазами, при использовании готового пакета не копировался файл на войну, я решил следующее:
Добавьте эту конфигурацию в 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. До свидания!
Ответ 4
Другое решение от меня, жаль, что опоздал на вечеринку, но все же может быть полезен для некоторых людей. Решение выше просто не работало для меня, потому что у меня были наложения, и поэтому использование плагина-заменителя было трудным в основном источнике. Следовательно, я использовал 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>
Ответ 5
Вы можете использовать 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 более поздней версии 2.0.1, вам нужно включить true в конфигурацию плагина maven-war, иначе изменения в ваших файлах будут splotted, когда военный плагин копирует ваш webapp во второй раз. Если вы используете Hudson/Jenkins, вам придется использовать версию более позднюю, чем 2.0.1.