19

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

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


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

# author.name@company.com #

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

env.name=${replacement.value}


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

我已经尝试寻找有关为什么会发生这种情况的文档 - 但找不到任何可以回答这种行为的东西。任何对文档或解释有用的指针将不胜感激。

以供参考:

  1. Maven版本:2.2.1
  2. Maven 程序集插件版本:2.2
4

6 回答 6

36

我已经尝试寻找有关为什么会发生这种情况的文档 - 但找不到任何可以回答这种行为的东西。任何对文档或解释有用的指针将不胜感激。

这在 Maven 程序集插件的过滤部分中没有记录,但看起来它使用与Maven 资源插件相同的默认分隔符,它们是:

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

因此,以下内容也将被过滤:

env.name=@replacement.value@

这也解释了为什么@电子邮件地址中的单个会引起麻烦(插件永远找不到结束分隔符)。

可以配置分隔符和转义字符串,就像使用Maven 资源插件时一样。单个目标的Maven 程序集插件文档提供了详细信息。

对于这种特定的电子邮件地址情况,一种廉价的解决方法是避免在文件中使用单个@来过滤:

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

env.name=${replacement.value}

作为一个好处,您将避免垃圾邮件:)

于 2010-10-30T05:07:27.233 回答
12

您应该在 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>
于 2012-11-28T18:00:46.673 回答
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>
于 2011-11-08T13:10:54.013 回答
4

这里是 Maven JIRA 问题的链接: https ://issues.apache.org/jira/browse/MRESOURCES-141

当资源中有奇数个@时过滤不起作用

于 2012-06-04T08:01:44.880 回答
4

我遇到了同样的问题,我使用了一些解决方法:

你必须保持'@'字符总是对等添加一个虚构的变量

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

env.name=${replacement.value}
于 2012-02-01T13:23:04.850 回答
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}

这应该会得到负分,因为它的工作原理很疯狂。

于 2018-01-25T20:46:46.983 回答