Maven - 资源过滤:资源文件中@符号的含义

时间:2010-10-29 21:47:02

标签: maven-2 filtering maven-assembly-plugin

我正在使用Maven程序集插件为不同的环境准备一些配置工件,我使用资源过滤来替换参数值。

我遇到了一个奇怪的行为,我有一个属性文件,内容如下:


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

#author.name@company.com#

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

env.name = $ {replacement.value}


作者电子邮件的'@'符号的存在导致所有属性引用被忽略。

我已经尝试过查找为什么会发生这种情况的文档 - 但找不到任何可以解决此问题的内容。任何有用的指向文档或解释的指针将非常感激。

供参考:

  1. Maven版本:2.2.1
  2. Maven Assembly插件版本:2.2

6 个答案:

答案 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}

这应该得到负面因素,因为它很有效。