我正在使用Run-> Run菜单从IntelliJ IDE运行一个简单的Java程序。它工作正常。现在我想添加log4j logging。
我在项目根目录下添加了一个资源文件夹。 我在该文件夹中添加了一个log4j.properties文件。 我更改了代码以记录某些内容。
告诉IntelliJ在类路径中包含resources文件夹以便看到属性文件的正确方法是什么?
使用IntelliJ 8,我可以猜到像醉猴一样,最终让它发挥作用。我现在有9个,而且我完全不成功。我已经尝试了一个小时。某处的“添加到类路径”选项怎么样? / fume / vent / rant
答案 0 :(得分:81)
试试这个:
答案 1 :(得分:47)
实际上,您至少有两种方法可以做到,第一种方式是由ColinD描述的,您只需将“resources”文件夹配置为IDEA中的Sources文件夹即可。如果资源模式包含资源的扩展名,那么当您生成项目时,它将被复制到输出目录,并且输出目录自动成为应用程序的类路径。
另一种常见方法是直接将“resources”文件夹添加到类路径中。转到项目结构|模块|你的模块|依赖关系,点击添加,单一条目模块库,指定“资源”文件夹的路径。
另一个解决方案是将 log4j.properties 文件直接放在项目的Source根目录下(在默认包目录中)。它与第一种方式相同,只是您不需要在模块路径设置中添加另一个源根,该文件将被复制到Make上的输出目录。
如果要使用不同的log4j配置进行测试,可以更轻松地直接在运行/调试配置, VM参数中指定自定义配置文件,如:
-Dlog4j.configuration=file:/c:/log4j.properties
。
答案 2 :(得分:38)
我遇到同样的问题,这让我非常恼火!!
我一直认为我倾向于回答2.过去常常在Intellij 9中工作(现在使用10)。
但是我发现通过将这些行添加到我的maven pom文件有助于:
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
...
</build>
答案 3 :(得分:16)
我花了很多时间在Intellij 13x中找出如何做到这一点。我显然从未将属性文件添加到需要它们的工件中,这是Intellij中的一个单独步骤。当您拥有由多个模块共享的属性文件时,下面的设置也可以使用。
答案 4 :(得分:13)
在类路径中添加带有.ini扩展名的文件时面临类似的挑战。 Found this answer,即将其添加到偏好设置 - &gt;编译器 - &gt;资源模式 - &gt; [...]; * .ini
答案 5 :(得分:3)
如果您最终遇到与Scala和SBT相同的问题:
转到项目结构。快捷方式是(CTRL + ALT + SHIFT + S)
在最左侧列表中,选择项目设置&gt;模块
在右侧的模块列表中,选择项目名称的模块(不带构建),然后选择“源”选项卡
在中间,展开项目根目录的文件夹/home/<username>/IdeaProjects/<projectName>
查看右侧的“内容根”部分,红色路径是您尚未创建的目录。您将要将属性文件放在Resources目录中。所以我创建了src/main/resources
并将log4j.properties放入其中。我相信你也可以修改内容根目录,把它放在你想要的任何地方(我没有这样做)。
我使用SBT配置运行我的代码,它找到了我的log4j.properties文件。
答案 6 :(得分:2)
对于那些从Eclipse迁移到IntelliJ的人,或者在处理属性文件或其他资源文件时,这是一个提示。
它令人抓狂(花了整整一个晚上才发现)但是当你想从IDE本地运行或在调试期间查找资源/属性文件时,IDE的工作方式都大不相同。 (打包到.jar也有很大差异,但记录得更好。)
假设您的代码中有这样的相对路径引用:
new FileInputStream("xxxx.properties");
(如果您使用不想与JAR一起打包的env特定.properties文件,这很方便)
(我使用13.1,但可能对更多版本有效)
文件xxxx.properties需要位于项目ROOT的PARENT目录下,以便在IntelliJ中像运行时一样在运行时获取。 (项目ROOT是/ src文件夹所在的位置)
当xxxx.properties文件位于项目ROOT本身时,Eclipse非常高兴。
所以IntelliJ希望.properties文件比Eclipse更高1级,就像这样引用!!
当您在导出的.jar中使用相同的代码行(新的FileInputStream(“xxxx.properties”);)时,这也会影响您执行代码的方式。 当你想要敏捷并且不想用你的jar包装.properties文件时,你必须像下面那样执行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文件所在的位置相同
答案 7 :(得分:2)
答案 8 :(得分:1)
也许这有点偏离主题,因为问题已经得到解答,但我遇到了类似的问题。在我的情况下,只有部分的单元测试资源在编译时被复制到输出文件夹。 META-INF 文件夹中的 persistence.xml 已复制,但没有其他。
最后,我通过重命名有问题的文件,重建项目,然后将文件名更改回原始文件来“解决”问题。不要问我为什么会这样,但确实如此。我最好的猜测是,不知何故,我的IntelliJ项目与文件系统有点不同步,重命名操作触发了某种内部“资源重新扫描”。
答案 9 :(得分:0)
我在单元测试的log4j.xml文件中遇到了类似的问题,完成了以上所有操作。但想到这是因为我只是重新运行一个失败的测试......如果我重新运行整个测试类,则会选择正确的文件。这是在Intelli-j 9.0.4
下答案 10 :(得分:0)
我知道我是一个愚蠢的人,所以在辛苦了一天之后,我花了很多时间尝试调试此问题并尝试了上面发布的所有响应,但最后,这是我许多最愚蠢的错误之一
我当时使用的是org.apache.logging.log4j.Logger
(:fml :),而我应该使用的是org.apache.log4j.Logger
。使用这个正确的记录器可以挽救我的生命。