mavenを使用している場合、通常、Javaまたはリソースの下にlog4j.propertiesを配置しますか?


128

従来のMavenディレクトリを使用する場合、log4j.propertiesファイルをどこに配置すればよいですか?


6
src / test / resources-アーティファクトのコンシューマーは、デプロイメントに必要なログレベルを設定します。ただし、商用でこれを行う場合は、slf4jをお勧めします。これにより、展開時にロギングフレームワークを切り替えるオプションが提供されます。 slf4j.org
デビッドビクター

2
ところで、properties / xml設定ファイルなしでlog4jを使用する可能性を実験したいだけの場合。「logging.apache.org/log4j/1.2/manual.html-構成」から「BasicConfigurator.configureメソッドを呼び出すと、かなり単純なlog4jセットアップが作成されます。」参照してください: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/... maven.apache.org/plugins/maven-resources-plugin/examples/...
デヴィッド・ビクター

回答:


141

src/main/resources これは「標準配置」です。

更新:上記は質問に答えますが、最善の解決策ではありません。これに関する他の回答とコメントを確認してください。おそらく、jarを使用して独自のロギングプロパティを出荷するのではなく、クライアント(アプリサーバー、ステージ環境など)に任せて、必要なロギングを構成します。したがって、それを入れることsrc/test/resourcesが私の好ましい解決策です。

注:クライアント/ユーザーに具体的なログの設定を残すといえば、あなたは置き換えることを検討すべきであるlog4jslf4jあなたのアプリに。


リソースディレクトリを作成できないことがわかりました。手動で行う必要がありますか?
user496949

3
うん。手動で作成するresourceslog4j.propertiesの回答で述べたフォルダにあります。
Nishant '27

@ user496949:下src/main/resourcesにあるファイルはデフォルトでにコピーされますtarget/classes
スプラッシュ

17
アーティファクトの一部としてlog4j設定をエクスポートする場合を除いて、src / test / resourcesの下に配置するのがはるかに良い
David Victor

1
@FerasOdehを使用して、生成されたアーティファクト(jar、warなど)から除外し、「アーティファクトの一部としてlog4j設定をエクスポートする場合を除き」、テスト中にのみ使用します。
Ali Shakiba

60

それを入れるだけでsrc/main/resources、アーティファクト内にバンドルされます。たとえば、アーティファクトがJARの場合、log4j.propertiesその中にファイルがあり、ロギングを構成可能にするという最初のポイントが失われます。

私は通常それをに入れsrc/main/resources、ターゲットに出力するように設定します:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}</targetPath>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

さらに、log4jが実際にそれを見るには、クラスパスに出力ディレクトリを追加する必要があります。アーティファクトが実行可能JARである場合は、maven-assembly-pluginを使用して作成した可能性があります。そのプラグイン内で、次のClass-Pathようにマニフェストエントリを追加することにより、JARの現在のフォルダーをクラスパスに追加できます。

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.your-package.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

これで、log4j.propertiesファイルがJARファイルのすぐ隣にあり、個別に構成できます。

エクリプスから直接アプリケーションを実行するには、追加resourcesあなたの実行構成で、あなたのクラスパスにディレクトリを:Run->Run Configurations...->Java Application->New選択しClasspath、タブを選択Advancedし、あなたを参照src/resourcesディレクトリ。


2
別のオプションは、バンドルされないようにsrc / test / resourcesの下に置くことです。
rogerdpack、2014

ワオ。それをありがとう。これはまさに私が必要としたものでした!
blissfool 2015

@ゾルタン、あなたが助言したように、クラスパスに出力ディレクトリを追加するのは難しいと思います。特定のプロジェクトの.classpathファイルに移動し、そこにこのlog4j出力ディレクトリを追加して、アプリが.warファイルにバンドルされた後、log4jが.propertiesファイルを参照できるようにする方法はありますか。また、targetPathタグ​​は、値をそのまま使用する${project.build.directory}か、プロジェクトがローカルドライブに存在する実際のパスに編集する必要がありますか?
イレティ

26

それを説明するいくつかの「データマイニング」がsrc/main/resources典型的な場所です。

Googleコード検索の結果:

  • src/main/resources/log4j.properties:4877
  • src/main/java/log4j.properties:215

4
この回答は、20分前に回答された回答とどの点でどのように異なりますか?また、それはだresourcesではないresource、私の記憶が正しければ、。
Nishant '27

6
@ニシャント:違いはありません。なぜなら、私が回答ボックスを開いたとき、私はPCを離れたからです。戻って質問に答えた後、私はその質問がすでに答えられていることを逃しました。resource単なるタイプミスでした。
スプラッシュ

1
Maven、Mavenコンパイラプラグイン、Mavenプロジェクトのレイアウトに関する規則について読んでみることをお勧めします。アーティファクトがビルドされたときに、「ターゲット」の下で何が起こっているのかを見てください。次に、おそらくあなたはあなたの答えを変更するかもしれません。
デビッドビクター

4
正解はsrc / xxx / resourcesです。これは慣例ではありません。参照:maven.apache.org/plugins/maven-resources-plugin/examples/…- ここで、「xxx」は「main」または「test」の場合があります。事前に構成されたログレベルを提供したくない場合を除き、「src / test / resources」を介してテストに必要なログを構成し、アーティファクトのコンシューマーがログレベルを設定できるようにするのが一般的です。
デビッドビクター

22
Googleの「橋から飛び降りる」の結果:18.200.000。「橋から飛び降りないでください」のGoogle検索結果:137.000
djjeck

9

プロジェクトの初期化に使用されるリソースは、src / main / resourcesフォルダーに配置するのが望ましいです。ビルド中にこれらのリソースのロードを有効にするには、ビルドリソースとしてmavenプロジェクトのpom.xmlにエントリを追加するだけです

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> 
        </resource>
    </resources>
</build> 

その他の.propertiesファイルも、初期化に使用されるこのフォルダーに保持できます。リソースフォルダーのプロパティファイルにいくつかの変数を設定し、プロファイルとして設定されているsrc / main / filtersに保持されているプロファイルフィルタープロパティファイルから変数を設定する場合、フィルタリングはtrueに設定されますが、これは完全に異なるユースケースです。現時点では、それらを無視できます。

これは素晴らしいリソースmavenリソースプラグインで、他のセクションも閲覧するだけで便利です。


上記のmavenスニペットをコピーして貼り付けるだけの場合は、</ resources> </ build>であることに注意してください
rdesilva '28

6

リソースファイルを別の場所に置くことは、使用できる最善のソリューションではありません。

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
<build>

たとえば、リソースファイル(jaxb.propertiesなど)がJavaクラスとともにパッケージの奥深くに入った場合などです。


1

log4j.propertiesまたはlog4j.xmlファイルがsrc / main / resourcesの下に見つからない場合は、このPropertyConfigurator.configure( "log4j.xml");を使用してください。

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);

0

ビルドタグ内のpom.xmlのリソースタグから以下のコードを追加します。つまり、リソースタグはpom.xmlのビルドタグ内にある必要があります

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.