6

一部のファイルの内容を変更する必要がある Maven スクリプトを扱っています。現在、replacer プラグインを使用していますが、置換値にドル記号が含まれていると問題が発生します。

私が問題を抱えている置換は比較的単純です。私のlog4j.xmlで、行<param name="File" value="wat.log" />を次のように置き換えます<param name="File" value="${FOO_BAR}/wat.log" />

そのように書かれていると、Mavenは${FOO_BAR}プロパティとして解釈することを私は知っています。解決策を調べて試してみました。ちょうど使うとき${FOO}

<properties>
    <dollar>$</dollar>
    <foo>{FOO_BAR}</foo>
    <dollar.foo>${dollar}${foo}</dollar.foo>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>replacer</artifactId>
            <version>1.5.3</version>
            <executions>
                <execution>
                    <id>configure-logging</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                    <configuration>
                        <includes>
                            <include>${my.configDir}/log4j.xml</include>
                        </includes>
                        <replacements>
                            <replacement>
                                <token>value="wat.log"</token>
                                <value>value="${dollar.foo}/wat.log"</value>
                            </replacement>
                        </replacements>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

結果はエラーnamed capturing group is missing trailing '}'です。私が理解しているように、プラグインは、正規表現でグループをキャプチャするために、置換テキストのドル記号とカーリーを解釈する通常の Java 正規表現置換を使用します。

他にもいくつか試してみましたが、この場合の特定のエラーはアンダースコアが原因のようです。fooプロパティをに変更する{FOOBAR}と、エラーが変わります: No group with name {FOOBAR}

他にもいくつか試しました:

  • fooプロパティをに変更する{foo}と、エラーは発生しませんが、置換によって が削除$value="{foo}/wat.log"fooますFOO_BAR
  • プロパティを変更するとエラーが発生{dollar}しますIllegal group reference
  • ドル記号、中括弧、および/またはアンダースコアをいくつかの異なる方法 (例: $$\$\\$) でエスケープしても、ドル記号に Unicode や $ を使用しても、それ以上のことはできませんでした。

Mavenでこれを実際に解決する方法はありますか? より多くのプロパティ、より多くの置換、またはまったく異なるプラグインを使用できれば幸いです。

更新:私は Windows で作業しています - それが結果に影響するかどうか、またはどのように影響するかはわかりません。

4

2 に答える 2

4

バックスラッシュに関連する別の問題を探して、自分で答えを見つけました:<regex>false</regex>置換プラグインの構成に追加すると、置換プラグインは表示されるプレーンテキストを置き換えるだけで、${dollar.foo}トリックは意図したとおりに機能します:

<properties>
    <dollar>$</dollar>
    <foo>{FOO_BAR}</foo>
    <dollar.foo>${dollar}${foo}</dollar.foo>
</properties>

...
                    <configuration>
                        <includes>
                            <include>${my.configDir}/log4j.xml</include>
                        </includes>


                        <!-- don't treat token/value as regular expressions -->
                        <regex>false</regex>


                        <replacements>
                            <replacement>
                                <token>value="wat.log"</token>
                                <value>value="${dollar.foo}/wat.log"</value>
                            </replacement>
                        </replacements>
                    </configuration>
...
于 2015-11-17T14:34:43.273 に答える