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@

また、これは、電子メールアドレスの1つが問題を引き起こしている理由も説明し@ています(プラグインが終了区切り文字を見つけることはありません)。

Maven Resources Pluginを使用する場合と同じように、区切り文字とエスケープ文字列を構成することができます。単一の目標に関する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

同じ問題が発生しましたが、@ sはフィルター処理されたSQLスクリプトの一部であったため、Pascalの回避策を使用できませんでした。そのため、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>
于 2011-11-08T13:10:54.013 に答える
4

私は同じ問題を抱えていました、私は少し回避策を使用しました:

'@'charを維持する必要があります常に架空の変数を追加するピア

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

env.name=${replacement.value}
于 2012-02-01T13:23:04.850 に答える
4

Maven JIRAの問題へのリンクは次のとおりです: https ://issues.apache.org/jira/browse/MRESOURCES-141

リソースに奇数の@がある場合、フィルタリングは機能しません

于 2012-06-04T08:01:44.880 に答える
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 に答える