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}

Ответ 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}

Это должно получить отрицательные моменты, поскольку это безумие, что оно работает.