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


122

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

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

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

借助IntelliJ 8,我可以像喝醉了的猴子一样猜测并最终使它工作。我现在有9个人,但我完全失败了。我已经尝试了一个小时。某个地方的“添加到类路径”选项怎么样?/烟/通风/授权


好的,情况已经解决。这是IntelliJ的新安装-默认情况下不包括log4J。在我的代码中,我导入了股票记录器,而不是log4j。股票记录器支持类似的方法,因此我使用的错误记录器不是很明显!毫不奇怪,为什么它没有读取log4j属性文件或报告我需要配置log4j。真是太好了!
托尼·恩尼斯

Answers:


91

试试这个:

  • 转到项目结构。
  • 选择您的模块。
  • 在右侧树中找到文件夹,然后选择它。
  • 单击该树上方的“源”按钮(带有蓝色文件夹),使该文件夹成为源文件夹。

我已经做了大约50次,但我又做了一次。即使将布局转换模式更改为显而易见的内容,我的输出也不会更改。我想知道我的类路径中是否还有另一个log4j.properties。
托尼·恩尼斯

29
检查编译器设置中的资源模式。检查其中是否有“?*。properties”。默认情况下它在那里,但这是我能想到的唯一的其他事情。
ColinD

3
替代Sourcesbutton的方法-右键单击您创建的任何目录,然后选择“将目录标记为”:“ Source Root”
mschr 2013年

10
请注意,如果您是从Maven POM(而不是临时源结构)创建项目的,则此解决方案将不起作用。相反,您需要将该目录作为资源添加到POM。参见彼得·蒂格森的答案。
lreeder

也可以通过PropertyConfigurator.configure(“ ../ conf / log4j.properties”)以编程方式完成
Jason D

47

实际上,您至少有两种方法可以完成此操作,第一种方法由ColinD描述,您只需在IDEA中将“ resources”文件夹配置为Sources文件夹即可。如果资源模式包含您的资源的扩展,那么它会在您复制到输出目录制作项目和输出目录自动为您的应用程序的类路径。

另一种常见的方法是将“ resources”文件夹直接添加到类路径。转到项目结构| 模块| 您的模块| 依存关系,单击“ 添加”,“ 单项模块库”,指定“资源”文件夹的路径。

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

如果要使用不同的log4j配置进行测试,则可以在“ 运行/调试配置”VM参数文件)中直接指定自定义配置文件,如下所示:

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


我已经完成了您的第2段和第3段,但没有任何效果。我确信建议起作用了,只是它们没有效果-行为就像在类路径中还有另一个log4j.properties文件一样。但是我在任何地方都看不到它。如果我完全删除我的log4j属性文件,则不会在控制台中看到“您必须配置log4j警告”。我第一次使用免费的IntelliJ(和9.x版),因此可能与此有关。
托尼·恩尼斯

1
使用显式-D VM参数也无效。在这一点上,我只能推测我已经从“愚蠢的树”的顶部跌落,并在跌落的途中击中了每个树枝!我想我会在JetBrains处拖网并四处询问...
Tony Ennis 2010年

您能否将包含重现问题的确切步骤的示例项目发送至support@jetbrains.com?
CrazyCoder

我在程序参数中传递了-Dlog4j.configuration = file:/ c:/log4j.properties。VM参数帮了我大忙。
2016年

42

我有同样的问题,这让我非常烦恼!

我一直以为我应该做答案2。这曾经在Intellij 9(现在使用10)中起作用。

但是我发现通过将这些行添加到我的maven pom文件中可以帮助:

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

那是我遇到的确切问题,现在资源文件已成功复制到输出文件夹。
artjomka 2013年

这个答案确实有效。我也做了colinD在他的评论中建议的内容。谢谢。

谢谢,这是为我解决的唯一解决方案。
MinhThiện18年

18

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

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

在此处输入图片说明


14

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


1
这是我使用.conf文件时遇到的确切问题
James

我以为我的代码到底出了什么问题?感谢您提供此解决方案
Shoaib Chikate 2014年

5

如果您最终在Scala和SBT中遇到相同的问题:

  • 转到项目结构。快捷方式是(CTRL + ALT + SHIFT + S)

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

  • 在其右侧的模块列表上,选择您的项目名称的模块(无构建),然后选择“源”选项卡

  • 在中间,展开对我来说项目根目录的文件夹 /home/<username>/IdeaProjects/<projectName>

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

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

在此处输入图片说明


2

对于那些从Eclipse迁移到IntelliJ或相反的人,这里是使用属性文件或其他资源文件时的提示。

它令人发疯(花了我一整个晚上的时间才能弄清楚),但是当您要从IDE本地运行或在调试过程中查找资源/属性文件时,两种IDE的工作方式却大不相同。(打包为.jar也是完全不同的,但是记录更好。)

假设您的代码中有一个相对路径引用,如下所示:

new FileInputStream("xxxx.properties");

(如果您要使用不希望与JAR一起打包的env特定.properties文件,这将很方便)

智力

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

文件xxxx.properties必须位于项目ROOT的PARENT dir中,以便在运行时像在IntelliJ中一样被拾取。(项目根目录是/ src文件夹所在的位置)

当xxxx.properties文件位于项目ROOT本身时,Eclipse感到很高兴。

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

当您在导出的.jar中具有同一行代码(new FileInputStream(“ xxxx.properties”);)时,这也会影响执行代码的方式。如果您想变得敏捷并且不想将.properties文件与jar打包在一起,则必须执行如下所示的jar,以便从命令行正确引用.properties文件:

出口智库

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

日食出口罐

java -jar some.jar

Eclipse导出的可执行jar只是希望引用的.properties文件位于与.jar文件所在位置相同的位置


是的,与log4j2.xml或log4j.properties不同,logging.properties必须在IntelliJ模块根目录中找到。与Log4j也不一样,后者仅能正常工作,我发现我仍然必须通过陪审团在IntelliJ中运行(Eclipse就是同一故事,这是Java日志记录的错),请参见stackoverflow.com/questions/960099/…。一种替代方法是使用-Djava.util.logging.config.file =修复运行/调试配置,我发现这很不方便,因为我希望在代码或预期的属性文件中进行配置。
Russ Bateman

1

看到这个问题已经回答,也许这有点题外话,但是我遇到了类似的问题。就我而言,编译时仅将一些单元测试资源复制到输出文件夹中。我在META-INF文件夹中的persistence.xml被复制了,但没有其他内容

最后,我通过重命名有问题的文件,重新构建项目,然后将文件名更改回原始文件来“解决”该问题。不要问我为什么这行得通,但是行得通。我最好的猜测是,以某种方式,我的IntelliJ项目与文件系统有些不同步,并且重命名操作触发了某种内部“资源重新扫描”。


1

这是我犯的愚蠢错误之一。我花了很多时间尝试调试此问题,并尝试了上面发布的所有响应,但最后,这是我许多愚蠢的错误之一。

我正在使用org.apache.logging.log4j.Logger(:fml :)而我应该使用org.apache.log4j.Logger。使用这个正确的记录器可以挽救我的夜晚。


0

对于单元测试,我在log4j.xml文件中遇到了类似的问题,上述所有操作均已完成。但是发现这是因为我只是在重新运行失败的测试....如果我重新运行整个测试类,则会提取正确的文件。这是在Intelli-j 9.0.4下

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.