Maven - фильтрация ресурсов: значение символа @ в файлах ресурсов - PullRequest
16 голосов
/ 30 октября 2010

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

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


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

# author.name@ company.com #

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

env.name = ${replace.value}


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

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

Для справки:

  1. Версия Maven: 2.2.1
  2. Версия подключаемого модуля Maven: 2.2

Ответы [ 6 ]

31 голосов
/ 30 октября 2010

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

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

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

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

env.name=@replacement.value@

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

Можно настроить разделители и escape-строку так же, как и при использовании плагина Maven Resources .В документации Maven Assembly Plugin для единственной цели содержатся подробности.

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

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

env.name=${replacement.value}

А в качестве преимущества вы избежите спама:)

10 голосов
/ 28 ноября 2012

Вы должны явно указать плагин в вашем 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>
9 голосов
/ 08 ноября 2011

У меня была та же проблема, но я не мог использовать обходной путь Паскаля, так как @s были частью отфильтрованных 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>

(distribution.xml)

<fileSet>
    <directory>target/filtered-resources/scripts</directory>
...
</fileSet>
4 голосов
/ 04 июня 2012

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

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

4 голосов
/ 01 февраля 2012

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

вы должны поддерживать символ @ всегда равным добавлению фиктивной переменной

###########################
author.name@company.com
falsevar=@
############################

env.name=${replacement.value}
0 голосов
/ 25 января 2018

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

@=@
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:
domain_email=name@example.com
domain_email_using_at=name@example.com
no_domain_email=name@${emaildomain}

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

...