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

时间:2010-09-22 02:51:15

标签: java intellij-idea classpath

我正在使用Run-> Run菜单从IntelliJ IDE运行一个简单的Java程序。它工作正常。现在我想添加log4j logging。

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

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

使用IntelliJ 8,我可以猜到像醉猴一样,最终让它发挥作用。我现在有9个,而且我完全不成功。我已经尝试了一个小时。某处的“添加到类路径”选项怎么样? / fume / vent / rant

11 个答案:

答案 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中的一个单独步骤。当您拥有由多个模块共享的属性文件时,下面的设置也可以使用。

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

enter image description here

答案 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文件。

enter image description here

答案 6 :(得分:2)

对于那些从Eclipse迁移到IntelliJ的人,或者在处理属性文件或其他资源文件时,这是一个提示。

它令人抓狂(花了整整一个晚上才发现)但是当你想从IDE本地运行或在调试期间查找资源/属性文件时,IDE的工作方式都大不相同。 (打包到.jar也有很大差异,但记录得更好。)

假设您的代码中有这样的相对路径引用:

new FileInputStream("xxxx.properties");

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

的IntelliJ

(我使用13.1,但可能对更多版本有效)

文件xxxx.properties需要位于项目ROOT的PARENT目录下,以便在IntelliJ中像运行时一样在运行时获取。 (项目ROOT是/ src文件夹所在的位置)

ECLIPSE

当xxxx.properties文件位于项目ROOT本身时,Eclipse非常高兴。

所以IntelliJ希望.properties文件比Eclipse更高1级,就像这样引用!!

当您在导出的.jar中使用相同的代码行(新的FileInputStream(“xxxx.properties”);)时,这也会影响您执行代码的方式。 当你想要敏捷并且不想用你的jar包装.properties文件时,你必须像下面那样执行jar,以便从命令行正确引用.properties文件:

INTELLIJ EXPORTED JAR

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

ECLIPSE EXPORTED JAR

java -jar some.jar

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

答案 7 :(得分:2)

右键单击您的目录,然后从将目录标记为选择资源根目录,如下所示:

enter image description here

答案 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。使用这个正确的记录器可以挽救我的生命。