将属性文件添加到IntelliJ的类路径中

137

我在IntelliJ IDE中使用Run->Run菜单运行一个简单的Java程序,它能正常工作。现在我想添加log4j日志记录。

我在项目根目录下添加了一个resources文件夹。 我在该文件夹中添加了一个log4j.properties文件。 我修改了代码以记录一些内容。

正确的方法是什么,告诉IntelliJ将资源文件夹包含在类路径中,以便看到属性文件?

在IntelliJ 8中,我可以像醉猴一样瞎猜,最终让它工作。我现在有9个版本,但完全没有成功。我已经尝试了一个小时。是否在某个地方添加“添加到类路径”选项?/fume /vent /rant


好的,情况已经解决。这是IntelliJ的新安装版本 - log4J默认未包含在内。在我的代码中,我已经导入了股票日志记录器,而不是log4j。股票日志记录器支持类似的方法,因此我使用错误的日志记录器并不明显!难怪它没有读取log4j属性文件或报告我需要配置log4j。真是一记重拳! - Tony Ennis
找到了一个适合初学者学习log4j的好描述: http://tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html - Rahal Kanishka
11个回答

100

尝试以下操作:

  • 进入项目结构。
  • 选择你的模块。
  • 在右侧的树形目录中找到文件夹并选择它。
  • 单击该树形目录上方的“Sources”按钮(带有蓝色文件夹图标),使该文件夹成为源文件夹。

我已经做了大约50次,我刚刚又做了一遍。尽管我将布局转换模式更改为明显的内容,但我的输出没有改变。我在想是否有另一个log4j.properties在我的类路径中。 - Tony Ennis
31
请在编译器设置中检查资源模式。确保"?*.properties"已经包含在其中。这是默认设置,但这是我能想到的唯一可能原因。 - ColinD
3
替代“Sources”按钮 - 右键单击您创建的任何目录,然后选择“标记目录为”:“源根”。 - mschr
12
请注意,如果您是通过Maven POM创建项目而不是自定义的源代码结构,那么此解决方案将无法奏效。相反,您需要将该目录添加为POM的资源。请参见Peter Thygesen的答案。 - lreeder
可以通过 PropertyConfigurator.configure("../conf/log4j.properties") 的编程方式来完成。 - Jason D
这个方法是可行的,但是如果你需要在两个不同的模块中使用特定的属性文件,则会遇到“两个模块不能共享相同的内容根目录”错误。在这种情况下,您应该使用“模块依赖项选项卡”的方式。 - Julius

49

实际上,您至少有两种方法可以做到这一点。第一种方法由ColinD描述,您只需将“resources”文件夹配置为IDEA中的源文件夹。如果资源模式包含您的资源扩展名,则在您制作项目并输出目录时,它将被复制到输出目录,输出目录自动成为应用程序的类路径。

另一种常见的方法是直接将"resources"文件夹添加到类路径中。转到项目结构 | 模块 | 您的模块 | 依赖项,点击添加单个条目模块库,指定到 "resources" 文件夹的路径。

另一种解决方案是直接将log4j.properties文件放在您项目的源代码根目录下(默认包目录)。这与第一种方式相同,只是您不需要在模块路径设置中添加另一个来源根目录,该文件将在制作时被复制到输出目录。

如果您想使用不同的log4j配置进行测试,可以更容易地直接在运行/调试配置VM参数字段中指定自定义配置文件,例如:

-Dlog4j.configuration=file:/c:/log4j.properties.


我已经尝试了你的第二和第三段,但没有效果。我相信这些建议是有效的,只是它们没有产生任何效果——它的行为就像类路径中还有另一个log4j.properties文件一样。但我找不到它的位置。如果我完全删除我的log4j属性文件,控制台就不会出现“必须配置log4j警告”。我第一次使用免费的IntelliJ(版本9.x),所以可能与此有关。 - Tony Ennis
1
使用显式的 -D VM 参数也没有任何效果。这时候我只能猜测我已经从“愚蠢树”的顶端跌落,并在下落过程中撞到了每一根树枝!我想我会到JetBrains周围转一圈,看看有没有人能帮忙... - Tony Ennis
请将包含问题重现步骤的示例项目发送至support@jetbrains.com,谢谢。 - CrazyCoder
我在程序参数中传递了“-Dlog4j.configuration=file:/c:/log4j.properties”。虚拟机参数对我很有帮助。 - Ajak6

48

我也遇到了同样的问题,让我非常苦恼!!

我一直认为应该像第二个答案所述那样操作。在Intellij 9中这个方法曾经可行(现在使用的是10)。

然而,我发现将以下这些行添加到我的Maven pom文件可以解决问题:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>

那正是我遇到的问题,现在资源文件已成功复制到输出文件夹。 - artjomka
这个答案真的很有效。我也按照colinD在评论中建议的做了。谢谢。 - user3034861
谢谢,这是唯一有效的解决方案。 - Minh Thiện

21

我花了很多时间在Intellij 13x中搞清楚如何做到这一点。显然我从未将需要它们的属性文件添加到工件中,这是Intellij中的一个单独步骤。下面的设置也适用于具有多个模块共享属性文件的情况。

  • 进入项目设置(CTRL + ALT + SHIFT + S)
  • 在列表中选择要向其添加一个或多个属性文件的模块。
  • 在右侧选择“依赖项”选项卡。
  • 点击绿色加号并选择“Jars or directories”。
  • 现在选择包含属性文件的文件夹。(我没有尝试包含单个文件)
  • Intellij现在会问您所选文件的“类别”是什么。选择“classes”(即使它们不是)。
  • 现在您必须将属性文件添加到工件中。Intellij会给出下面显示的快捷方式。它会在底部的红色部分显示错误,并显示一个“红色灯泡”,当单击它时,会显示一个选项,以将文件添加到工件中。您也可以转到“工件”部分,并手动将文件添加到工件中。

输入图像描述


14

遇到了类似的挑战,需要将扩展名为 .ini 的文件添加到类路径中。找到了这个答案,即在“首选项 -> 编译器 -> 资源模式 -> [...] ;*.ini”中添加它。


1
这正是我在.conf文件中遇到的确切问题。 - James
我一直在想我的代码哪里出了问题?感谢这个解决方案。 - Shoaib Chikate

6
如果您在Scala和SBT方面遇到相同的问题:
  • 进入项目结构。快捷键是(CTRL + ALT + SHIFT + S)

  • 在最左边的列表中,选择项目设置>模块

  • 在右侧的模块列表中,选择项目名称的模块(不包括构建),并选择源选项卡

  • 在中间,展开项目根目录所在的文件夹,例如/home/<username>/IdeaProjects/<projectName>

  • 查看右侧的内容根部分,红色路径是您未创建的目录。您将需要将属性文件放在资源目录中。因此,我创建了src/main/resources并将log4j.properties放入其中。我相信您也可以修改内容根目录以将其放在任何位置(我没有这样做)。

  • 我使用SBT配置运行代码,并且它找到了我的log4j.properties文件。

enter image description here


非常感谢,它解决了我的问题。 - asifaftab87

2

对于那些从Eclipse迁移到IntelliJ或者反过来的人,这里有一个技巧,可用于处理属性文件或其他资源文件。

当你想要在IDE中本地运行或调试时,两个IDE在查找资源/属性文件方面的工作方式非常不同,这让人感到非常恼火(我花了整整一个晚上才发现)。 (打包成.jar文件也非常不同,但文档记录得更好。)

假设您的代码中有一个相对路径引用,就像这样:

new FileInputStream("xxxx.properties");

如果你使用环境特定的 .properties 文件,并且不想将其打包到 JAR 文件中,那么这是很方便的。

INTELLIJ

(我使用 13.1,但可能适用于更多版本)

在 IntelliJ 中,xxxx.properties 文件需要在项目根目录的父目录中才能在运行时被识别出来。 (项目根目录是 /src 文件夹所在的位置)

ECLIPSE

Eclipse 只需要 xxxx.properties 文件在项目根目录下即可。

因此,当像这样引用文件时,IntelliJ 希望 .properties 文件比 Eclipse 高一级!!

当你不想将 .properties 文件与 jar 文件一起打包时,这也会影响你执行代码的方式。为了正确地从命令行引用 .properties 文件,你需要像下面这样执行 jar:

在 INTELLIJ 导出的 JAR 中

java -cp "/path/to_properties_file/:/path/to_jar/some.jar" com.bla.blabla.ClassContainingMainMethod

导出 Eclipse JAR 文件

java -jar some.jar

Eclipse导出的可执行jar文件期望引用的.properties文件与.jar文件放在同一位置。


是的,logging.properties必须在IntelliJ模块根目录中找到,而不像log4j2.xml或log4j.properties。与Log4j不同的是,它只是工作的,我发现我仍然必须调整一下才能在IntelliJ内运行(Eclipse也是同样的情况,这是Java日志的问题),请参见https://dev59.com/lnNA5IYBdhLWcg3wcNbF。一个替代方法是通过使用-Djava.util.logging.config.file=来修复run/debug配置,但我觉得这样做非常不方便,因为我宁愿在代码或预期的属性文件中进行配置。 - Russ Bateman

2
右键单击您的目录,从“标记目录为”中选择“资源根目录”,如下所示:

enter image description here


1
也许这有点离题,因为问题已经得到了解答,但我也遇到了类似的问题。在我的情况下,只有一些单元测试资源在编译时被复制到输出文件夹中。我的META-INF文件夹中的persistence.xml被复制了,但没有其他东西。
最后,我通过重命名有问题的文件,重新构建项目,然后将文件名改回原始名称来“解决”问题。不要问我为什么这样做有效,但确实有效。我最好的猜测是,我的IntelliJ项目与文件系统有点不同步,重命名操作触发了某种内部的“资源重新扫描”。

1
这是我犯过的一个愚蠢错误。我花了很长时间试图调试这个问题,并尝试了上面发布的所有响应,但最终,这是我许多愚蠢错误之一。
我正在使用org.apache.logging.log4j.Logger (:fml:),而我应该使用org.apache.log4j.Logger。使用正确的记录器挽救了我的晚上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接