我正在使用Maven程序集插件为不同的环境准备一些配置工件,我使用资源过滤来替换参数值。
我遇到了一个奇怪的行为,我有一个属性文件,内容如下:
###########################
#author.name@company.com#
############################
env.name = $ {replacement.value}
作者电子邮件的'@'符号的存在导致所有属性引用被忽略。
我已经尝试过查找为什么会发生这种情况的文档 - 但找不到任何可以解决此问题的内容。任何有用的指向文档或解释的指针将非常感激。
供参考:
答案 0 :(得分:31)
我已经尝试过查找为什么会发生这种情况的文档 - 但找不到任何可以解决此问题的内容。任何有用的指向文档或解释的指针将非常感激。
Maven Assembly Plugin的filtering section中没有记录这一点,但看起来它使用与Maven Resources Plugin相同的默认分隔符:
<build>
...
<plugin>
...
<configuration>
...
<delimiters>
<delimiter>${*}</delimiter>
<delimiter>@</delimiter>
</delimiters>
因此,以下内容也将被过滤:
env.name=@replacement.value@
这也解释了为什么电子邮件地址中的单个@
会导致麻烦(插件永远不会找到结束分隔符)。
可以配置分隔符和转义字符串,就像使用Maven Resources Plugin时一样。 Maven Assembly Plugin documentation for the single goal提供了详细信息。
对于此特定电子邮件地址情况,一种廉价的解决方法是避免在文件中使用单个@
进行过滤:
##############################
# author.name aT company.com #
##############################
env.name=${replacement.value}
作为一项好处,您将避免垃圾邮件:)
答案 1 :(得分:10)
您应该在pom.xml中明确指定插件。隐含地,它使用2.4.1,它有这个问题。您可以通过运行maven -X resources:resources来验证maven正在使用哪个版本。
2.6版解决了这个问题。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</plugin>
答案 2 :(得分:9)
我遇到了同样的问题,但我不能使用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 :(得分:4)
我有同样的问题,我使用了一些解决方法:
你必须保持'@'char总是同伴添加一个虚构的变量
###########################
author.name@company.com
falsevar=@
############################
env.name=${replacement.value}
答案 4 :(得分:4)
这里是Maven JIRA问题的链接: https://issues.apache.org/jira/browse/MRESOURCES-141
当资源
中存在奇数个@时,过滤不起作用
答案 5 :(得分:0)
这非常有效。在属性文件中定义如下:
@=@
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}
这应该得到负面因素,因为它很有效。