17

私たちのプロジェクトは、log4j.properties ファイルで構成された Log4J を使用します。ログを区別できるように、複数の運用サーバーがあり、それらは異なるログ ファイルに記録されます。したがって、ノード 1 の log4j.properties は次のようになります。

...
log4j.appender.Application.File=D:/logs/application_1.log
...
log4j.appender.tx_info.File=D:/logs/tx_info_1.log
...

ノード2のlog4j.propertiesは次のようになります

...
log4j.appender.Application.File=D:/logs/application_2.log
...
log4j.appender.tx_info.File=D:/logs/tx_info_2.log
...

サーバー構成を生成するために、すでに Maven プロファイルを使用しています。これまで、上記のようにログ ファイル名のみが異なるいくつかの異なる log4j.properties ファイルが含まれていました。次のようなリソース テンプレート ファイルを使用して、Maven でこれらのファイルを生成したいと思います。

...
log4j.appender.Application.File=${log.location}/application${log.file.postfix}.log
...
log4j.appender.tx_info.File=${log.location}/tx_info${log.file.postfix}.log
...

Maven を異なる値で複数回実行して${log.file.postfix}、毎回 1 つの異なるログ プロパティ ファイルを生成するのは簡単です。ただし、私が望むのは、1 つのビルドでサーバーごとに個別のプロパティ ファイル (名前/パスが異なる) を生成することです。たとえば、antrunプラグインを介してこれを実行できると確信していますが、それについてはよく知りません。これを達成する最も簡単な方法は何ですか?

4

4 に答える 4

16

(...) これは、たとえば antrun プラグインを介して行うことができると確信していますが、私はそれに慣れていません。これを達成する最も簡単な方法は何ですか?

実際、POM でresources:copy-resourcesおよび いくつかを使用できます (ただし、ターゲット ファイルの名前を変更することはできません)。<execution>resources:copy-resources

次の構造があるとします。

$ tree .
.
├── pom.xml
└── src
    ├── main
    │   ├── filters
    │   │   ├── filter-node1.properties
    │   │   └── filter-node2.properties
    │   ├── java
    │   └── resources
    │       ├── log4j.properties
    │       └── another.xml
    └── test
        └── java

はプレースlog4j.propertiesホルダーを使用しており、filter-nodeN.propertiesファイルには値が含まれています。例えば:

# filter-node1.properties

log.location=D:/logs
log.file.postfix=_1

次に、pom.xmlリソース プラグインを構成し、ノードごとに 1 つを定義して、特定の出力ディレクトリと特定のフィルタを使用し<execution>て呼び出します。copy-resources

<project>
  ...
  <build>
    <resources>
      <!-- this is for "normal" resources processing -->
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering><!-- you might still want to filter them -->
        <excludes>
          <!-- we exclude the file from "normal" resource processing -->
          <exclude>**/log4j.properties</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <id>copy-resources-node1</id>
            <phase>process-resources</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/target/node1</outputDirectory>
              <resources>
                <resource>
                  <directory>src/main/resources</directory>
                  <filtering>true</filtering>
                  <includes>
                    <include>**/log4j.properties</include>
                  </includes>
                </resource>
              </resources>
              <filters>
                <filter>src/main/filters/filter-node1.properties</filter>
              </filters>
            </configuration>
          </execution>
          <execution>
            <id>copy-resources-node2</id>
            <phase>process-resources</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/target/node2</outputDirectory>
              <resources>
                <resource>
                  <directory>src/main/resources</directory>
                  <filtering>true</filtering>
                  <includes>
                    <include>**/log4j.properties</include>
                  </includes>
                </resource>
              </resources>
              <filters>
                <filter>src/main/filters/filter-node2.properties</filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

mvn を実行process-resourcesすると、次の結果が生成されます。

$ tree .
.
├── pom.xml
├── src
│   ├── main
│   │   ├── filters
│   │   │   ├── filter-node1.properties
│   │   │   └── filter-node2.properties
│   │   ├── java
│   │   └── resources
│   │       ├── log4j.properties
│   │       └── another.xml
│   └── test
│       └── java
└── target
    ├── classes
    │   └── another.xml
    ├── node1
    │   └── log4j.properties
    └── node2
        └── log4j.properties

それぞれに適切な値を使用しますlog4j.properties

$ cat target/node1/log4j.properties 
log4j.appender.Application.File=D:/logs/application_1.log
log4j.appender.tx_info.File=D:/logs/tx_info_1.log

これはちょっと機能しますが、冗長であり、適切な量のノードがある場合、これは問題になる可能性があります。


forMaven AntRun Plugin を使用して、より簡潔で保守可能なものを作成しようとしましたが、タスクをMaven で動作させることができずant-contrib(理由は不明ですが、forタスクが認識されません)、あきらめました

Maven AntRun プラグインを使用した代替方法を次に示します。複雑なことやループはありません。ソース ファイルを別の場所にコピーし、その場で名前を変更し、コンテンツをフィルタリングするだけです。

  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <id>copy-resources-all-nodes</id>
        <phase>process-resources</phase>
        <configuration>
          <tasks>
            <copy file="src/main/resources/log4j.properties" toFile="target/antrun/log4j-node1.properties">
              <filterset>
                <filter token="log.location" value="D:/logs"/>
                <filter token="log.file.postfix" value="_1"/>
              </filterset>
            </copy>
            <copy file="src/main/resources/log4j.properties" toFile="target/antrun/log4j-node2.properties">
              <filterset>
                <filter token="log.location" value="D:/logs"/>
                <filter token="log.file.postfix" value="_2"/>
              </filterset>
            </copy>
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Ant は@デフォルトでトークンの区切り記号として使用することに注意してください (Maven スタイルの区切り記号を使用するように取得できませんでした) log4j.properties

log4j.appender.Application.File=@log.location@/application@log.file.postfix@.log
log4j.appender.tx_info.File=@log.location@/tx_info@log.file.postfix@.log

しかし、これらの値はノード固有のように見えるため、代わりにシステム プロパティを使用することを検討しましたか (起動スクリプトに配置できます)。これは私がすでに( を使用してlog4j.xml)行ったことであり、うまく機能し、物事を非常に単純化します。

于 2010-07-23T05:46:11.063 に答える
1

試すことができるいくつかのアプローチを次に示します。

  1. antrun プラグインとcopyタスクを使用して、フェーズでリソース ファイルの複製を作成しますgenerate-resources。antrun プラグインの使用例は、この SO の質問に対するmaven によるコピーに関する回答に記載されています。Ant のプロパティ展開を使用して、各 ${log.file.postfix} を個別の値 (リテラル値 1、2、3 など) または一意のプレースホルダー ${log.file.postfix1}、${ に展開することもできます。 log.file.postfix2} は、maven がリソース フィルタリングを行うときに最終的に置き換えられます。

  2. antrun を使用する代わりに、バージョン管理システムを使用して、同じファイルの複数のコピーをセットアップします。次に、 resources:copy-resourcesゴールの複数のインスタンスを実行し、それぞれに異なるプロパティ値を構成し、異なるターゲット ファイル名を指定します。

于 2010-07-22T12:17:42.957 に答える
0

コピーする必要があるターゲット構成が多数ある場合は、maven-antrun-plugin を ant マクロ定義と一緒に使用できます。

  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <id>copy-resources-all-nodes</id>
        <phase>process-resources</phase>
        <configuration>
          <tasks>
             <macrodef name="copyConfigFile">
                <attribute name="node"/>

                <sequential>
                   <copy file="src/main/resources/log4j.properties"
                         toFile="target/antrun/log4j-@{node}.properties">
                      <filterset>
                         <!-- put the node-specific config in property files node1.properties etc -->
                         <filtersfile file="config/@{node}.properties"/>
                      </filterset>
                   </copy>
                </sequential>
             </macrodef>

             <copyConfigFile node="node1"/>
             <copyConfigFile node="node2"/>
             <copyConfigFile node="node3"/>
             ...

          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

本当に多くのターゲット構成がある場合は、ant-contrib を使用してターゲット構成のリストを反復処理することもできます。

ここにこれを行う方法の例があります

于 2014-01-06T16:34:30.603 に答える