IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题

1、触发事件

今天正好在学习log4j,为了测试其配置文件log4j.properties中的各种配置,进行了频繁修改和程序启动以确认效果,因为是使用的IDEA建立的Web项目,接着问题就来了,配置文件修改后,重新运行Tomcat发现根本没有生效,刚开始怀疑是文件中配置的写法不对而且google了很久,反反复复发现配置没有问题但是就是不行。

幸好知道IDEA中对于artifacts的定义,相当于部署包,Tomcat运行时实际是去读取的这个东西里的文件,其编译方式之前在另篇博客《理解 IntelliJ IDEA 的项目配置和Web部署》中也有提到,一会儿在下面再单独提一下。所以接下来,我又找到artifacts的文件夹目录,到里面去找log4j.properties看看,发现配置内容还是我更改之前的,怪不得运行没有效果,因为真正读取的配置文件根本就没有改变。

可是IDEA编译的时候不是会把目录内容复制到artifacts目录下吗?为什么不是最新的配置文件?目前猜想可能跟IDEA版本有关,这个留在下面在讲。

大概的触发事件就是这样,不过最终还是得到了解决,大概写一下,说不定能帮助到别人。


2、IDEA的编译方式

这里提IDEA的编译方式,是为了最后更好地描述和理解。

IDEA的编译方式和Eclipse不同,它并不是自动编译,而是每次在容器运行之前进行先编译,再运行。我们可以看到Tomcat中的容器配置:

IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
 
IDEA中编译方式有如下三种,如上图所示,这里我们每次容器运行之前,都进行了Make方式的代码编译:
  • Compile:对选定的目标(Java 类文件),进行强制性编译,不管目标是否是被修改过。
  • Rebuild:对选定的目标(Project),进行强制性编译,不管目标是否是被修改过,由于 Rebuild 的目标只有 Project,所以 Rebuild 每次花的时间会比较长。
  • Make:使用最多的编译操作。对选定的目标(Project 或 Module)进行编译,但只编译有修改过的文件,没有修改过的文件不会编译,这样平时开发大型项目才不会浪费时间在编译过程中。

另外,注意看第二个黄色标记的地方 “Build '你的artifact名称' artifact”,这里就要提到容器运行时,IDEA都做了什么(更多详情参考理解 IntelliJ IDEA 的项目配置和Web部署):
  • 在运行server前会做一次编译。编译后class文件存放在指定的项目编译输出目录下;
  • 根据artifact中的设定对目录结构进行创建;
  • 拷贝web资源的根目录下的所有文件到artifact的目录下;
  • 拷贝编译输出目录下的classes目录到artifact下的WEB-INF下;
  • 拷贝lib目录下所需的jar包到artifact下的WEB_INF下;
  • 运行server,运行成功后,如有需要,会自动打开浏览器访问指定url。


3、大概是IDEA10的特例

了解了IDEA的编译方式,可以知道,那么就算是配置文件,只要其所在文件夹设置为了资源目录,那么在容器运行的时候,实际上也是会将里面的内容复制到最后的artifact中去的,可是我自己在尝试的时候IDEA却没有按常理出牌。

我找了下相关的问题,有的网友贴了图,我才发现,高版本的IDEA中对于配置文件的目录,有单独的资源标志。如下有网友回答情况:
IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
 
标记为Resources的目录会被复制到artifact中。

可是我看了下我的IDEA10的配置结构,并没有这个东西:
IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
 
就算配置文件的目录标志为唯一能用的Sources了,IDEA还是不给我复制。所以我理解,Sources可能只会复制过去能编译的文件,最终复制过去的即是 .class 文件,而诸如 .properties 的配置文件是不会复制的。

怎么办,难道要手动复制?幸好,网友的力量是强大的,按照如下步骤执行:

1、把所需要的配置文件的文件夹,以依赖的方式导入项目:
IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
 
2、在artifact配置中,将这两个文件夹添加进去
IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
 
3、添加完成后会发现,左侧output_root中就有了这两个文件夹目录,之后容器在运行的时候,就会将这文件夹中的内容复制到artifact中去,也就是达到了我们的目的
IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
 
此时再运行,每次的配置文件修改,都可以看到效果变更了。
 
什么,你问我为什么项目一开始运行的时候没有发现这个问题?因为这个项目老大第一次给我的时候,配置文件直接就已经在artifact中有一份了,并不知道是他之前手动放进去的,还是怎么回事。

而且,其实更另我困惑的是,其他的配置文件诸如strust.xml,之前我也并没有按照如上所述解决方案去进行处理,可是修改后是可以生效的,我也就搞不懂到底是IDEA哪里出了问题,之前可以现在不行,摊手。所以就有这个 “大概是IDEA10的特例” 的子标题。

很伤,反正不开心。


4、参考链接