Maven — фильтрация ресурсов: значение символа @ в файлах ресурсов

Я использую плагин сборки Maven для подготовки некоторых артефактов конфигурации для разных сред и использую фильтрацию ресурсов для замены значений параметров.

Я столкнулся со странным поведением, когда у меня был файл свойств со следующим содержимым:


###########################

# автор.имя@company.com #

############################

env.name=${replacement.value}


Присутствие символа '@' для адреса электронной почты автора приводило к игнорированию всех ссылок на свойства.

Я пытался найти документацию о том, почему это происходит, но не могу найти ничего, что отвечало бы этому поведению. Любые полезные указатели на документацию или объяснение будут высоко оценены.

Для справки:

  1. Версия Мавена: 2.2.1
  2. Версия плагина сборки Maven: 2.2

person Dinuk    schedule 29.10.2010    source источник


Ответы (6)


Я пытался найти документацию о том, почему это происходит, но не могу найти ничего, что отвечало бы этому поведению. Любые полезные указатели на документацию или объяснение будут высоко оценены.

Это не задокументировано в фильтрации раздел плагина сборки Maven, но похоже, что он использует те же разделители по умолчанию, что и Подключаемый модуль Maven Resources, а именно:

<build>
  ...
  <plugin>
    ...
    <configuration>
      ...
      <delimiters>
        <delimiter>${*}</delimiter>
        <delimiter>@</delimiter>
      </delimiters>

Таким образом, следующее также будет отфильтровано:

[email protected]@

И это также объясняет, почему один @ в адресе электронной почты вызывает проблемы (плагин никогда не находит конечный разделитель).

Можно настроить разделители и escape-строку, как при использовании Подключаемый модуль Maven Resources. документация по плагину Maven Assembly для одной цели содержит Детали.

Дешевый обходной путь для этой конкретной ситуации с адресом электронной почты — избегать использования одного @ в файле для фильтрации:

##############################
# author.name aT company.com #
##############################

env.name=${replacement.value}

И как преимущество, вы избежите спама :)

person Pascal Thivent    schedule 30.10.2010
comment
Я попытался использовать объявление разделителя и получил ошибки XSD, pom стал недействительным. Даже в объявлении плагина ресурса, поскольку плагин привязан к жизненному циклу процесса, вы не можете переопределить значения по умолчанию, AFAIK. - person Cheruvim; 13.01.2016

Вы должны явно указать плагин в вашем pom.xml. Неявно он использует 2.4.1, в котором есть эта проблема. Вы можете проверить, какую версию использует maven, запустив maven -X resources:resources.

Версия 2.6 устранила эту проблему.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
</plugin>
person cwu9T9    schedule 28.11.2012

У меня была та же проблема, но я не мог использовать обходной путь Pascal, поскольку @ были частью отфильтрованных сценариев SQL. Поэтому я подробно остановился на решении Pascal и не нашел способа переопределить разделители по умолчанию в плагине сборки. Однако я нашел еще один полезный пост (в самом низу): 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>

(распространение.xml)

<fileSet>
    <directory>target/filtered-resources/scripts</directory>
...
</fileSet>
person Ondrej Burkert    schedule 08.11.2011

у меня была такая же проблема, я использовал небольшой обходной путь:

вы должны всегда поддерживать '@' char, добавляя фиктивную переменную

###########################
[email protected]
falsevar=@
############################

env.name=${replacement.value}
person Ging3r    schedule 01.02.2012

Вот ссылка на проблему Maven JIRA: https://issues.apache.org/jira/browse/MRESOURCES-141

Фильтрация не работает, когда в ресурсе нечетное количество @

person Laurent Ho    schedule 04.06.2012

Это серьезно работает. Определите в файле свойств следующим образом:

@=@
emaildomain=example.com

Attempt to set-up an email address using both ${@} and just @.

domain_email=name${@}${emaildomain}
domain_email_using_at=name${@}@emaildomain@
no_domain_email=name@${emaildomain}

Results:
[email protected]
[email protected]
no_domain_email=name@${emaildomain}

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

person Mike    schedule 25.01.2018
comment
Более практичным способом было бы определить переменную atsign=@. Это также работает. - person Mike; 26.01.2018