Maven - фильтрация ресурсов: последствия символа @в файлах ресурсов
Я использую плагин сборки Maven для подготовки некоторых артефактов конфигурации для разных сред, и я использую фильтрацию ресурсов для замены значений параметров.
Я столкнулся с странным поведением, когда у меня был файл свойств с содержимым следующим образом:
###########################
# [email protected] #
############################
env.name = ${replacement.value}
Наличие символа '@' для электронной почты автора вызывало игнорирование всех ссылок на свойства.
Я попытался найти документацию о том, почему это происходит, но не может найти ничего, что могло бы ответить на это поведение. Любые полезные указатели на документацию или объяснение будут высоко оценены.
Для справки:
- Версия Maven: 2.2.1
- Плагин Maven Assembly Plugin: 2.2
Ответы
Ответ 1
Я попытался найти документацию о том, почему это происходит, но не может найти ничего, что могло бы ответить на это поведение. Любые полезные указатели на документацию или объяснение будут высоко оценены.
Это не описано в разделе фильтрации модуля Maven Assembly Plugin, но похоже, что он использует те же разделители по умолчанию, что и Плагин Maven Resources, которые:
<delimiters>
<delimiter>${*}</delimiter>
<delimiter>@</delimiter>
</delimiters>
Итак, будет также отфильтровано следующее:
[email protected]@
И это также объясняет, почему один @
в адресе электронной почты вызывает проблемы (плагин никогда не находит конечный разделитель).
Можно настроить разделители и escape-строку так же, как при использовании Maven Resource Plugin. Документация Maven Assembly Plugin для единой цели содержит сведения.
Дешевое обходное решение для этой конкретной ситуации с адресом электронной почты будет состоять в том, чтобы избежать использования единственного @
в файле для фильтрации:
##############################
# author.name aT company.com #
##############################
env.name=${replacement.value}
И как преимущество, вы избежите спама:)
Ответ 2
У меня была такая же проблема, но я не мог использовать обходное решение Pascal, поскольку @s были частью фильтрованных SQL-скриптов. Поэтому я разработал решение Pascal и не нашел способа переопределить разделители по умолчанию в Assembly Plugin. Однако я нашел еще один полезный пост (в самом низу):
http://web.archiveorange.com/archive/v/F1XzEmhzIHiBcpS0RyC6
Что предлагает использовать правильно настроенный плагин ресурсов для копирования и фильтрации проблемных ресурсов, а затем использовать эти отфильтрованные ресурсы в плагине сборки. например.:
(Pom.xml)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target/filtered-resources/scripts</outputDirectory>
<resources>
<resource>
<directory>src/assemble/resources/scripts</directory>
<filtering>true</filtering>
</resource>
</resources>
<useDefaultDelimiters>false</useDefaultDelimiters>
<delimiters>
<delimiter>${*}</delimiter>
</delimiters>
</configuration>
</execution>
</executions>
</plugin>
(distribution.xml)
<fileSet>
<directory>target/filtered-resources/scripts</directory>
...
</fileSet>
Ответ 3
Вы должны указать плагин явно в своем pom.xml. Неявно, он использует 2.4.1, у которого есть эта проблема. Вы можете проверить, какая версия maven используется, запустив ресурсы maven -X: ресурсы.
Версия 2.6 исправила эту проблему.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</plugin>
Ответ 4
У меня была та же проблема, я использовал небольшое обходное решение:
вы должны mantain '@' char всегда добавлять однозначную переменную
###########################
[email protected]
[email protected]
############################
env.name=${replacement.value}
Ответ 5
Здесь ссылка на Maven JIRA:
https://issues.apache.org/jira/browse/MRESOURCES-141
Фильтрация не работает, если в ресурсе есть нечетное число @
Ответ 6
Это серьезно работает. Определите в файле свойств следующим образом:
@[email protected]
emaildomain=example.com
Attempt to set-up an email address using both ${@} and just @.
domain_email=name${@}${emaildomain}
domain_email_using_at=name${@}@[email protected]
[email protected]${emaildomain}
Results:
[email protected]
[email protected]
[email protected]${emaildomain}
Это должно получить отрицательные моменты, поскольку это безумие, что оно работает.