2010-10-29 4 views
16

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

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


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

# [email protected] #

########################### №

env.name = $ {replacement.value}


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

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

Для справки:

  1. Maven Версия: 2.2.1
  2. Maven Ассамблеи Plugin Версия: 2,2

ответ

28

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

Это не документировано в filtering section в Maven Ассамблеи плагин, но, похоже, она использует те же разделители по умолчанию как Maven Resources Plugin, которые:

<delimiters> 
    <delimiter>${*}</delimiter> 
    <delimiter>@</delimiter> 
</delimiters> 

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

[email protected]@ 

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

Можно настроить разделители и escape-строку так же, как и при использовании Maven Resources Plugin. Maven Assembly Plugin documentation for the single goal содержит подробную информацию.

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

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

env.name=${replacement.value} 

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

+10

OMG - Потеряно 4 часа на этом и было готово завершить программирование навсегда .... – HDave

+0

Я попытался использовать объявление разделителя, и у меня появились ошибки XSD, ошибка стала недействительной. Даже в объявлении плагина ресурса, поскольку плагин привязан к жизненному циклу процесса, вы не можете переопределить AFAIK по умолчанию. – Cheruvim

9

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

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

вы должны означают сохранение '@' символ всегда указывайте фиктивную переменную

########################### 
author.na[email protected] 
[email protected] 
############################ 

env.name=${replacement.value} 
9

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

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

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.6</version> 
</plugin> 
0

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

@[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} 

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

+0

Более практичным способом было бы определить переменную atsign = @. Это также работает. – Mike

Смежные вопросы