如果使用Maven,通常将log4j.properties放在Java或资源下?


128

使用常规Maven目录时,应该将log4j.properties文件放在哪里?


6
src / test / resources-工件的使用者将设置部署所需的日志记录级别。但是,如果您要进行商业工作,我建议使用slf4j。这提供了在部署时切换日志记录框架的选项。 slf4j.org
David Victor

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/...
大卫·维克托

Answers:


141

src/main/resources 是为此的“标准展示位置”。

更新:上面的答案,但不是最佳解决方案。查看其他答案和对此的评论……您可能不会将自己的日志记录属性与jar一起交付,而是将其留给客户端(例如,app-server,舞台环境等)来配置所需的日志记录。因此,放入它src/test/resources是我的首选解决方案。

注意:说到将具体的日志配置留给客户端/用户,您应该考虑在应用中替换log4jslf4j


我发现没有创建资源目录。我需要手动做吗?
user496949 2011年

3
是的 手动创建resourceslog4j.properties在答案中提到的文件夹中。
Nishant

@ user496949:src/main/resources默认情况下,以下文件会被复制到target/classes
splash

17
除非你打算在你的log4j的设置导出为你的神器的一部分-它是更好的把它在src /测试/资源
大卫·维克托

1
@FerasOdeh将其从生成的工件(罐子,战争等)中排除,仅在测试期间使用,“除非您打算将log4j设置导出为工件的一部分”。
阿里·沙基巴

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文件旁边,可以独立配置。

要直接从Eclipse运行应用程序,请将resources目录添加到运行配置中的类路径中:Run->Run Configurations...->Java Application->New选择Classpath选项卡,选择Advanced并浏览到src/resources目录。


2
另一个选择是将其放在src / test / resources下,以免被捆绑。
rogerdpack 2014年

哇。感谢那。这正是我所需要的!
blissfool

@Zoltán,我发现很难按照您的建议将输出目录添加到类路径中。有没有一种方法可以手动完成,例如进入特定项目的.classpath文件并在其中添加此log4j输出目录,以便在将应用程序捆绑到.war文件后,log4j可以看到.properties文件。另外,targetPath标记是否应该按原样使用该值,${project.build.directory}或者应将其编辑为项目在本地驱动器中的实际路径?
Ireti

26

一些“数据挖掘”解释了这src/main/resources一点。

结果于 Google代码搜索

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

4
这个答案与20分钟前的答案有何不同?另外,如果我没记错的话,它resources也不resource是。
Nishant

6
@Nishant:没什么不同,因为当我打开答案框时,我离开了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文件也可以保留在此文件夹中,用于初始化。如果要在资源文件夹的属性文件中包含一些变量并从配置文件过滤器属性文件中填充变量,则将过滤设置为true,这些文件保存在设置为配置文件的 src / main / filters中但完全是另一种用例。现在,您可以忽略它们。

这是一个很棒的资源maven资源插件,它很有用,也可以浏览其他部分。


如果您只是复制并粘贴上面的Maven片段,请注意,它是</ resources> </ build>
rdesilva 2014年

6

如果将资源文件放在另一个位置不是最佳解决方案,则可以使用:

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

例如,当资源文件(例如jaxb.properties)连同Java类一起深入包中时。


1

如果在src / main / resources下找不到您的log4j.properties或log4j.xml文件,请使用此PropertyConfigurator.configure(“ log4j.xml”);

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

0

在pom.xml的build标记内,从resources标记添加以下代码。所以这意味着资源标签必须在pom.xml中的build标签内

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.