如果使用maven,通常你把log4j.properties放在java或resources下?

Posted

技术标签:

【中文标题】如果使用maven,通常你把log4j.properties放在java或resources下?【英文标题】:If using maven, usually you put log4j.properties under java or resources? 【发布时间】:2011-07-05 04:19:52 【问题描述】:

在使用传统的 Maven 目录时,我应该把 log4j.properties 文件放在哪里?

【问题讨论】:

src/test/resources - 您的工件的使用者将设置部署所需的日志记录级别。但是,如果您这样做是为了商业工作,我会推荐 slf4j。这提供了在部署时切换日志框架的选项。 slf4j.org 顺便说一句,如果您只是想试验一下在没有 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/… 【参考方案1】:

src/main/resources 是这个的“标准位置”。

更新:以上回答了这个问题,但它不是最好的解决方案。查看其他答案和有关此问题的 cmets ...您可能不会将自己的日志记录属性与 jar 一起发送,而是将其留给客户端(例如应用服务器、舞台环境等)来配置所需的日志记录。因此,将其放入 src/test/resources 是我的首选解决方案。

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

【讨论】:

我发现没有创建资源目录。我需要手动操作吗? 是的。在答案中提到的文件夹中手动创建resourceslog4j.properties @user496949:src/main/resources 下的文件将默认复制到target/classes 除非您打算将 log4j 设置作为工件的一部分导出 - 最好将其放在 src/test/resources 下 @FerasOdeh 将其从生成的工件(jars、wars 等)中排除并仅在测试期间使用,“除非您打算将 log4j 设置导出为工件的一部分”。【参考方案2】:

只需将其放入 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-&gt;Run Configurations...-&gt;Java Application-&gt;New 选择 Classpath 选项卡,选择 Advanced 并浏览到您的 src/resources 目录。

【讨论】:

另一种选择可能是将它放在 src/test/resources 下,这样它就不会被捆绑。 哇。感谢那。这正是我所需要的! @Zoltán,我发现很难按照您的建议将输出目录添加到类路径中。有没有办法我可以手动完成,比如进入特定项目的 .classpath 文件并在那里添加这个 log4j 输出目录,以便在应用程序捆绑到 .war 文件后 log4j 可以看到 .properties 文件。此外,targetPath 标记应该按原样使用 $project.build.directory 值还是应该将其编辑为项目在我的本地驱动器中的实际路径?【参考方案3】:

一些“数据挖掘”说明src/main/resources是典型的地方。

Google Code Search 上的结果:

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

【讨论】:

这个答案与 20 分钟前的答案有何不同?另外,如果我没记错的话,是resources 而不是resource @Nishant:没有什么不同,因为当我打开答案框时,我离开了电脑。回来回答问题后,我错过了问题已经回答。 resource 只是一个错字。 我建议阅读一下 maven、maven 编译器插件、maven 项目布局的约定。当你的工件被构建时,也许看看“目标”下的位置。那么也许你可以修改你的答案。 正确答案是 src/xxx/resources - 这不是惯例。请参阅:maven.apache.org/plugins/maven-resources-plugin/examples/… - 这里的 'xxx' 可能是 'main' 或 'test'。除非您希望提供预先配置的日志记录级别,否则通常更明智的做法是根据测试需要配置日志记录 - 通过“src/test/resources” - 并允许您的工件的使用者设置日志记录级别。 “跳下桥”的 Google 搜索结果:18.200.000。 “不要跳下桥”的 Google 搜索结果:137.000【参考方案4】:

用于初始化项目的资源最好放在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 中,设置为 profiles 但是这是一个完全不同的用例。目前,您可以忽略它们。

这是一个很好的资源maven resource plugins,它很有用,也可以浏览其他部分。

【讨论】:

如果只是复制粘贴上面的maven sn -p,请注意是 【参考方案5】:

如果将资源文件放在其他位置不是您可以使用的最佳解决方案:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

在构建标签内的 pom.xml 中的资源标签中添加以下代码。 所以这意味着资源标签必须在你的 pom.xml 中的构建标签内

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

【讨论】:

以上是关于如果使用maven,通常你把log4j.properties放在java或resources下?的主要内容,如果未能解决你的问题,请参考以下文章

slf4j 怎么调用 log4j

如果使用maven,通常你将log4j.properties放在java或资源下?

Maven学习笔记—仓库

Maven无法下载JAR包

Maven使用Nexus搭建Maven私服

Maven私服Nexus安装与使用